PHP5マジック関数の具体的な応用解説_PHPチュートリアル

WBOY
リリース: 2016-07-15 13:29:17
オリジナル
862 人が閲覧しました

PHP5 のマジック関数 1、__construct() オブジェクトをインスタンス化するとき、最初にオブジェクトのこのメソッドが呼び出されます。出力は次のとおりです: start 同じクラス名の php5 オブジェクト モデルと関数が class のコンストラクターであることがわかっているため、コンストラクターと __construct() メソッドを同時に定義すると、php5 はデフォルトではコンストラクターであり、__construct() 関数ではないため、__construct() はクラス

PHP5 マジック関数 2.__destruct() のデフォルトのコンストラクターとして機能します。このメソッドは、オブジェクトが削除されるか、オブジェクトの操作が終了するときに呼び出されます。出力は

end

になります。 オブジェクト操作が終了するとリソースを解放できます。

PHP5 マジック関数 3 のような操作では、存在しないプロパティを読み取ろうとするときに __get() が呼び出されます。

オブジェクトに存在しないプロパティを読み取ろうとすると、PHP はエラー メッセージを表示します。クラスに __get メソッドを追加すると、この関数を使用して Java のリフレクションと同様のさまざまな操作を実装できます

<ol class="dp-xml">
<li class="alt"><span><span>class Test   </span></span></li>
<li class=""><span>{   </span></li>
<li class="alt"><span> function __construct()   </span></li>
<li class=""><span> {   </span></li>
<li class="alt"><span>  echo "before";   </span></li>
<li class=""><span> }   </span></li>
<li class="alt">
<span>}   </span><span></span><span></span>
</li>
<li class="">
<span>$</span><span class="attribute"><font color="#ff0000">t</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">new</font></span><span> Test();  </span>
</li>
</ol>
ログイン後にコピー

PHP5 マジック関数 4、存在しないプロパティに値を書き込もうとすると __set() が呼び出されます。

<ol class="dp-xml">
<li class="alt"><span><span>class Test   </span></span></li>
<li class=""><span>{   </span></li>
<li class="alt"><span> function __destruct()   </span></li>
<li class=""><span> {   </span></li>
<li class="alt"><span>  echo "end";   </span></li>
<li class=""><span> }   </span></li>
<li class="alt"><span>}   </span></li>
<li class="">
<span>$</span><span class="attribute"><font color="#ff0000">t</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">new</font></span><span> Test(); </span>
</li>
</ol>
ログイン後にコピー

PHP5 マジック関数 5,__call() を実行するオブジェクトを呼び出そうとするときメソッドが存在しない場合は、このメソッドを呼び出します。

<ol class="dp-xml">
<li class="alt"><span><span>class Test   </span></span></li>
<li class=""><span>{   </span></li>
<li class="alt"><span> public function __get($key)   </span></li>
<li class=""><span> {   </span></li>
<li class="alt"><span>  echo $key . " 不存在";   </span></li>
<li class=""><span> }   </span></li>
<li class="alt"><span>}   </span></li>
<li class=""><span> </span></li>
<li class="alt"><span> </span></li>
<li class="">
<span>$</span><span class="attribute"><font color="#ff0000">t</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">new</font></span><span> Test();   </span>
</li>
<li class="alt">
<span>echo $t-</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>name;   </span>
</li>
<li class=""><span> </span></li>
<li class="alt"><span>就会输出:  </span></li>
<li class=""><span>name 不存在  </span></li>
</ol>
ログイン後にコピー
プログラムは次のように出力します:

呼び出したい getName メソッドは、存在する。パラメータは次のとおりです: Array

(

[0] => aning

[1] => go

)

PHP5 マジック関数 6、オブジェクトを印刷するときに __toString() が呼び出されます

このメソッドは Java に似ていますtoString メソッドは、オブジェクトを直接印刷するときにこの関数を呼び出します

りー

いつecho $t;, $t->__toString(); を実行すると、

Print Test

PHP5 マジック関数 7 が呼び出され、オブジェクトが複製されるときに __clone() が呼び出されます

PHP5 マジック関数 8.ところで、php5で提供されている非常にCOOlな実験的な関数をいくつか紹介します

(1)runkit_method_rename

この関数は呼び出す関数の名前を動的に変更することができます。

<ol class="dp-xml">
<li class="alt"><span><span>class Test   </span></span></li>
<li class=""><span>{   </span></li>
<li class="alt"><span> public function __set($key,$value)   </span></li>
<li class=""><span> {   </span></li>
<li class="alt"><span>  echo '对'.$key . "附值".$value;   </span></li>
<li class=""><span> }   </span></li>
<li class="alt"><span>}   </span></li>
<li class=""><span> </span></li>
<li class="alt"><span> </span></li>
<li class="">
<span>$</span><span class="attribute"><font color="#ff0000">t</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">new</font></span><span> Test();   </span>
</li>
<li class="alt">
<span>$t-</span><span class="tag"><strong><font color="#006699">></font></strong></span><span class="attribute"><font color="#ff0000">name</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">"aninggo"</font></span><span>;   </span>
</li>
<li class=""><span> </span></li>
<li class="alt"><span>就会输出:  </span></li>
<li class=""><span>对 name 附值 aninggo </span></li>
</ol>
ログイン後にコピー

(2) runkit_method_add

This PHP5マジック関数はクラスに関数を動的に追加できます

<ol class="dp-xml">
<li class="alt"><span><span>class Test   </span></span></li>
<li class=""><span>{   </span></li>
<li class="alt"><span> public function __call($Key, $Args)   </span></li>
<li class=""><span> {   </span></li>
<li class="alt"><span>  echo "您要调用的 {$Key} 方法不存在。你传入的参数是:" . print_r($Args, true);   </span></li>
<li class=""><span> }   </span></li>
<li class="alt"><span>}   </span></li>
<li class=""><span> </span></li>
<li class="alt">
<span>$</span><span class="attribute"><font color="#ff0000">t</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">new</font></span><span> Test();   </span>
</li>
<li class="">
<span>$t-</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>getName(aning,go);  </span>
</li>
</ol>
ログイン後にコピー

(3)runkit_method_copy

クラス A の関数をクラス B にコピーして、PHP5 マジック関数の名前を変更できます

<ol class="dp-xml">
<li class="alt"><span><span>class Test   </span></span></li>
<li class=""><span>{   </span></li>
<li class="alt"><span> public function __toString()   </span></li>
<li class=""><span> {   </span></li>
<li class="alt"><span>  return "打印 Test";   </span></li>
<li class=""><span> }   </span></li>
<li class="alt"><span>}   </span></li>
<li class=""><span> </span></li>
<li class="alt"><span> </span></li>
<li class="">
<span>$</span><span class="attribute"><font color="#ff0000">t</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">new</font></span><span> Test();   </span>
</li>
<li class="alt"><span> </span></li>
<li class=""><span>echo $t;   </span></li>
</ol>
ログイン後にコピー

(4) runkit_method_redefine

Dynamic 関数の戻り値を変更する

この PHP5 マジック関数を使用すると、クラス MOCK テストを簡単に実装できます!クールじゃないですか?
  1. class Example {  
  2.     function foo() {  
  3.         return "foo! ";  
  4.     }  
  5. }  
  6. //创建一个测试对象  
  7. $e = new Example();  
  8. // 在测试对象之前输出  
  9. echo "Before: " . $e->foo();  
  10. // 修改返回值  
  11. runkit_method_redefine(  
  12.     'Example',  
  13.     'foo',  
  14.     '',  
  15.     'return "bar! ";',  
  16.     RUNKIT_ACC_PUBLIC  
  17. );  
  18. // 执行输出  
  19. echo "After: " . $e->foo();  

(5)runkit_method_remove

这个PHP5魔术函数就很简单了,看名字就能看出来了,动态的从类中移除函数

<ol class="dp-xml">
<li class="alt"><span><span>class Test {  </span></span></li>
<li class=""><span>    function foo() {  </span></li>
<li class="alt"><span>        return "foo! ";  </span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>      </span></li>
<li class=""><span>    function bar() {  </span></li>
<li class="alt"><span>        return "bar! ";  </span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>}  </span></li>
<li class=""><span> </span></li>
<li class="alt"><span>// 移除foo函数  </span></li>
<li class=""><span>runkit_method_remove(  </span></li>
<li class="alt"><span>    'Test',  </span></li>
<li class=""><span>    'foo'  </span></li>
<li class="alt"><span>);  </span></li>
<li class=""><span> </span></li>
<li class="alt"><span>echo implode(' ', get_class_methods('Test'));  </span></li>
<li class=""><span> </span></li>
<li class="alt"><span>程序输出  </span></li>
<li class=""><span>bar  </span></li>
</ol>
ログイン後にコピー

以上所介绍的代码就是关于PHP5魔术函数的具体应用方式。


www.bkjia.comtruehttp://www.bkjia.com/PHPjc/446384.htmlTechArticle在 PHP5魔术函数1,__construct() 当实例化一个对象的时候,这个对象的这个方法首先被调用。 classTest { function__construct() { echo"before"; } } $ t =...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート