ホームページ >バックエンド開発 >PHPチュートリアル >PHP オブジェクトの新しいメソッドに関連する問題

PHP オブジェクトの新しいメソッドに関連する問題

WBOY
WBOYオリジナル
2016-06-13 12:20:42913ブラウズ

PHP オブジェクト
に新しいメソッドを追加するという問題は、次のような非常に一般的な書き方です:

<br /><br />class MyClass<br />{<br />     funciton a(){<br />       echo 'a';<br />     }<br />}<br /><br /><br />class MyClassExted extends MyClass<br />{<br />     function b(){<br />          echo 'b';<br />     }<br />}<br /><br />$test = new MyClassExted();<br />$test->b();<br /><br /><br />


いくつかの理由から、次のように使用できることを願っています:
<br /><br />$test = new MyClass();<br />$test->b();<br /><br />



次のように「見えます」:


class MyClass
{
funciton a(){
echo 'a';
}
}


class MyClass extends MyClass
{
function b(){
echo 'b';
}
}<br /><br />$test = new MyClass();<br />$test->b();<br /><br />


しかし、これは間違っています。新しい拡張のクラス名は親とは異なる必要があります。それで、何が問題ですか?

クラスにメソッドを直接追加する方法はありますか?

-----解決策のアイデア----------------------
そのような方法はありません
MyClass クラス MyClassExted にメソッド b() を記述してみてはいかがでしょうか。MyClass を継承した後、MyClass のメソッド b() をオーバーライドできます
<br />class MyClass<br />{<br />     function a(){<br />       echo 'a';<br />     }<br />	 function b(){<br />       echo 'MyClass b';<br />     }<br />}<br />class MyClassExtend extends MyClass<br />{<br />     function b(){<br />          echo 'MyClassExtend b';<br />     }<br />}<br /> <br />$MyClass = new MyClass();<br />$MyClass->b();//MyClass b<br /><br />$MyClassExtend = new MyClassExtend();<br />$MyClassExtend->b();//MyClassExtend b<br />

--- ---解決策----------------------
クラスのインターフェースを予約できます
class MyClass<br />{<br />     funciton a(){<br />       echo 'a';<br />     }<br /><br />     function __call($name, $param) {<br />        if(function_exists($name)) {<br />            return call_user_func_array($name, $param);<br />        }<br />     }<br />}<br /><br />function b() {<br />  echo $b;<br />}<br /><br />$test = new MyClass();<br />$test->b();<br />

------解決策のアイデア----------------------
<br />class MyClass<br />{<br />     function a(){<br />       echo 'a';<br />     }<br /><br />     function __call($name, $param){<br />     	if($name=='b'){<br />     		echo 'b';<br />     	}<br />     }<br />}<br /><br />$obj = new MyClass();<br />$obj->b();<br />

- -----ソリューションのアイデア----------------------
拡張およびアップグレードされたバージョンを提供します
<br /><?php<br />class api_base<br />{<br />     function a(){<br />       echo 'a111';<br />     }<br />     function __call($name, $param) {<br />        static $methods = array();<br />        if(!method_exists($this, $name)){<br />            list($api, $fun) = explode('_',$name);<br />			empty($fun) && $fun = 'index';<br />			if(!isset($methods[$api])){<br />                include_once('class.api.'.$api.'.php');<br />                $method = 'api_'.$api;<br />                $methods[$api] = new $api();<br />            }<br />			if(!method_exists($methods[$api], $fun)){<br />				die('error');<br />			}<br />            call_user_func_array(array($methods[$api], $fun), $param);<br />        }<br />     }<br />}<br />  <br />$test = new api_base();<br />$test->b(1,2,3);<br />$test->b(4,5,6);<br /><br />$test->b_test(1,2,3);<br />$test->b_haha(4,5,6);<br />?><br />class.api.b.php:<br /><?php<br />class api_b extends api_base<br />{<br />     function index($a,$b,$c){<br />       echo "$a - $b - $c <br>";<br />     }<br />     function test($a,$b,$c){<br />       echo "$a - $b - $c <br>";<br />     }<br />	 function haha($a,$b,$c){<br />       echo "$a - $b - $c <br>";<br />     }<br />}<br />?><br />

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。