ホームページ >バックエンド開発 >PHPチュートリアル >PHPのマジックメソッド
PHP マジック メソッド: <br>
__construct()、__destruct()、__call()、__callStatic()、__get()、__set()、__isset()、__unset()、__sleep()、__wakeup()、 __toString()、__invoke()、__set_state()、__clone()、__debugInfo() などのメソッドは、PHP では「マジック メソッド」と呼ばれます。マジック機能を使用しない限り、独自のクラス メソッドに名前を付けるときにこれらのメソッド名を使用することはできません。 <br>
__construct(),类的构造函数 __destruct(),类的析构函数 __call(),在对象中调用一个不可访问方法(私有或者不存在)时调用 __callStatic(),用静态方式中调用一个不可访问方法时调用 __get(),获得一个类的成员变量时调用 __set(),设置一个类的成员变量时调用 __isset(),当对不可访问属性调用isset()或empty()时调用 __unset(),当对不可访问属性调用unset()时被调用。 __sleep(),执行serialize()时,先会调用这个函数 __wakeup(),执行unserialize()时,先会调用这个函数 __toString(),类被当成字符串时的回应方法 __invoke(),调用函数的方式调用一个对象时的回应方法 __set_state(),调用var_export()导出类时,此静态方法会被调用。 __clone(),当对象复制完成时调用
__construct() と __destruct()<br> コンストラクター __construct() はオブジェクトの作成時に呼び出され、デストラクター __destruct() はオブジェクトの消滅時に呼び出されます
<?php   class ConDes {     protected $a = '';     function __construct(){         echo '在构造函数中<br>'; } function __destruct(){ echo '在析构函数中<br>'; } } $val = new ConDes(); unset($val); ?><pre name="code" class="php">出力:
コンストラクター内とデストラクター内
オブジェクト内でアクセスできないメソッドが呼び出された場合、__call() と __callStatic() が呼び出されます。後者は静的メソッドです。
出力:配列 (サイズ = 2)<br> 0 => 文字列 'オブジェクト コンテキスト内' (長さ = 17)<br> 1 => 文字列 '別の引数' (長さ = 11)<br> オブジェクト メソッド runTest とオブジェクト コンテキスト内の別の引数<br>静的メソッド runTest と静的コンテキスト内
__get()、__set()、__isset() および __unset()<br>これら 2 つの関数は、アクセスできないクラス メンバー変数を取得するとき、またはアクセスできないクラス メンバー変数を設定するときに呼び出されます。 <br>
出力:__set<br>配列 (サイズ=1)<br> 'a' => 文字列 'aaaa' (長さ=4)<br>__get<br>配列 (サイズ=1)<br> 'a' => 文字列 'aaaa' (長さ=4) <br>__isset<br>set<br>__unset
__sleep()と__wakeup()<br>serialize()とunserialize()を実行すると、これら2つの関数が最初に呼び出されます。たとえば、オブジェクトをシリアル化する場合、そのオブジェクトにはデータベース リンクが含まれており、逆シリアル化中にリンク状態を復元したい場合は、これら 2 つの関数を再構築することでリンクを復元できます。
<code><span></span>
<?php class MethodTest { public function __call ($name, $arguments) { var_dump($arguments); echo "object method $name and ".implode(',',$arguments)."<br>"; } public static function __callStatic ($name, $arguments) { echo "static method $name and ".implode(',',$arguments)."<br>"; } } $obj = new MethodTest; $obj->runTest('in object context','another arg'); MethodTest::runTest('in static context'); ?>出力:
<span>array (size=4)<br> 0 => string '1' (length=1)<br> 'id' => string '1' (length=1)<br> 1 => string 'm0sh1' (length=5)<br> 'username' => string 'm0sh1' (length=5)<br>sleep<br>wakeup<br>object(Connection)[2]<br> public 'link' => resource(6, mysql link)<br> private 'server' => string 'localhost' (length=9)<br> private 'username' => string 'moshi' (length=4)<br> private 'password' => string 'moshi' (length=5)<br> private 'db' => string 'test' (length=4)<br>array (size=4)<br> 0 => string '1' (length=1)<br> 'id' => string '1' (length=1)<br> 1 => string 'm0sh1' (length=5)<br> 'username' => string 'm0sh1' (length=5)</span>
<span>__toString()<br>对象当成字符串时的回应方法。例如使用echo $obj;</span>
<code><span></span>
0 => 文字列 '1' (length=1)<code><span></span><code><span></span> 'id' => 文字列 'm0sh1' (length=5)
'username' => string 'm0sh1' (length=5)sleep<br>wakeup
object(Connection)[2]public 'link' => resource(6, mysql link)<br> private 'サーバー' => 文字列 'localhost' (長さ=9)
プライベート 'ユーザー名' => 文字列 'moshi' (長さ=4)<br> プライベート 'パスワード' => 文字列 'moshi' (長さ=5) 'db' => 文字列 'test' (長さ = 4)配列 (サイズ = 4)<br> 0 => 文字列 '1' (長さ = 1)<br> 'id' => 文字列 '1' (長さ = 1)
1 => 文字列 'm0sh1' (長さ=5)'ユーザー名' => 文字列 'm0sh1' (長さ=5)<br><br>
__toString()<br>オブジェクトを文字列として扱う場合のレスポンスメソッド。たとえば、 echo $obj;<br><br><br><br><br>
<?php class MethodTest { private $data = array(); private $a = ''; public $bbb = ''; public function __set($name, $value){ $this->data[$name] = $value; echo '__set'; var_dump($this->data); } public function __get($name){ echo '__get'; var_dump($this->data); if(array_key_exists($name, $this->data)) return $this->data[$name]; return NULL; } public function __isset($name){ echo '__isset'; return isset($this->data[$name]); } public function __unset($name){ echo '__unset'; unset($this->data[$name]); } } $in = new MethodTest(); $in->a = 'aaaa'; $aaa = $in->a; $res = isset($in->c)? 'set':'not set'; echo '<br>'.$res.'<br>'; unset($in->a); ?>を使用して出力します。
<br>
<br>
これはオブジェクトです<br>このメソッドは文字列のみを返すことができ、このメソッドでは例外をスローできません。そうでない場合は、致命的なエラーが発生します。 <br><br>__invoke()
関数呼び出しでオブジェクトを呼び出す際のレスポンスメソッド。rree
出力:in invoke
boolean true🎜boolean false🎜🎜__set_state()🎜この静的メソッドは、クラスをエクスポートするために var_export() が呼び出されるときに呼び出されます。 🎜🎜<?php class Connection {     public $link;     private $server, $username, $password, $db;          public function __construct($server, $username, $password, $db)     {         $this->server = $server; $this->username = $username; $this->password = $password; $this->db = $db; $this->connect(); } private function connect() { $this->link = mysql_connect($this->server, $this->username, $this->password); mysql_select_db($this->db, $this->link); } public function __sleep() { echo 'sleep<br>'; return array('server', 'username', 'password', 'db'); } public function __wakeup() { echo 'wakeup<br>'; $this->connect(); } } $a = new Connection('localhost','mosi','moshi','test'); $sql = 'select id,username from user limit 1'; $res = mysql_query($sql,$a->link); $res = mysql_fetch_array($res); var_dump($res); $sres = serialize($a); mysql_close($a->link); //unset($a); $unsres = unserialize($sres); var_dump($unsres); $sql = 'select id,username from user limit 1'; $ress = mysql_query($sql,$unsres->link); $ress = mysql_fetch_array($ress); var_dump($ress); ?>🎜出力: 🎜🎜object(A)[1]🎜 public 'var1' => int 5🎜 public 'var2' => (length=3)🎜A::__set_state(array( 'var1' => 5, 'var2' => 'foo', ))🎜object(A)[2]🎜 public 'var1' => string 'var11' (length=5)🎜 public 'var2' => string 'foo' (length=3)🎜🎜__clone()🎜 オブジェクトのコピーが完了すると呼び出されます。 🎜rree🎜出力: 🎜等しい🎜クローンは許可されていませんエラー: 256🎜🎜🎜PHP マジック定数: ここで紹介します🎜🎜 🎜 上記では、関連するコンテンツも含めて PHP の魔法のメソッドを紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。 🎜 🎜 🎜