PHP におけるマジック メソッドの定義は、2 つのアンダースコア __ で始まるメソッドをマジック メソッドと呼びます。PHP におけるこれらのマジック メソッドの役割は非常に重要です。これらのマジック メソッドの例を見てみましょう。
マジック メソッド:
__construct(),类的构造函数 __destruct(),类的析构函数 __call(),在对象中调用一个不可访问方法时调用 __callStatic(),用静态方式中调用一个不可访问方法时调用 __get(),获得一个类的成员变量时调用 __set(),设置一个类的成员变量时调用 __isset(),当对不可访问属性调用isset()或empty()时调用 __unset(),当对不可访问属性调用unset()时被调用。 __sleep(),执行serialize()时,先会调用这个函数 __wakeup(),执行unserialize()时,先会调用这个函数 __toString(),类被当成字符串时的回应方法 __invoke(),调用函数的方式调用一个对象时的回应方法 __set_state(),调用var_export()导出类时,此静态方法会被调用。 __clone(),当对象复制完成时调用
__construct() および __destruct()
コンストラクター関数とデストラクター関数は次のようになります。よく知られているように、これらはオブジェクトの作成時と破棄時に呼び出されます。たとえば、ファイルを開き、オブジェクトが作成されたときにファイルを開き、オブジェクトが消滅したときにファイルを閉じる必要があります。
<?php class FileRead { protected $handle = NULL; function __construct(){ $this->handle = fopen(...); } function __destruct(){ fclose($this->handle); } } ?>
これら 2 つのメソッドは、継承時に拡張できます。たとえば、次のようになります。
<?php class TmpFileRead extends FileRead { function __construct(){ parent::__construct(); } function __destruct(){ parent::__destruct(); } } ?>
これら 2 つのメソッドは、オブジェクト内でアクセスできないメソッドが呼び出されたときに呼び出されます。後者は静的メソッドです。これら 2 つのメソッドは、変数メソッド (変数関数) 呼び出しで使用できます。
<?php class MethodTest { public function __call ($name, $arguments) { echo "Calling object method '$name' ". implode(', ', $arguments). "\n"; } public static function __callStatic ($name, $arguments) { echo "Calling static method '$name' ". implode(', ', $arguments). "\n"; } } $obj = new MethodTest; $obj->runTest('in object context'); MethodTest::runTest('in static context'); ?>
__get 属性は、アクセス オブジェクト内の属性が存在しない場合、または属性が存在しない場合に自動的にロードされる __get メソッドです。パブリック属性。パラメータには、アクセス オブジェクトの 属性の名前である名前の値が 1 つだけあります。
__set は、オブジェクト内の属性に値を割り当てるときに使用します。属性が存在しないか、非パブリック属性の場合、__set メソッドが自動的にロードされます。 2 つのパラメータがあります。パラメータ 1 は、アクセス オブジェクト内の呼び出し不可能な属性の名前です。パラメータ 2 は、割り当てのために渡されるパラメータです。配列または文字列にすることができます。
すべてパブリック可視性を持ちます。静的ではありません。理解しやすいように小さな栗を示します。
<?php /** * 清晰的认识__get() __set() */ class Example { //公有的属性 public $public = 'pub' ; //受保护的 - 子类中该属性可用 protected $protected = 'pro'; //私有的 - 只能此类使用此属性 private $private = 'pri'; //当访问对象中的属性不存在或者非公有属性的时候自动加载__get()方法 public function __get($name){ return '调用__get()方法:'.$name; } //当给对象的一个属性赋值的时候如果该属性不存在或者是非公有属性则自动加载__set()方法 public function __set($name,$value){ echo "\nname:".$name.',value:'.$value."\n"; } } $example = new Example; echo '<pre class="brush:php;toolbar:false">'; echo $example->public."\n"; echo $example->protected."\n"; echo $example->private."\n"; echo $example->other."\n"; echo '<hr>'; $example->public = 'lic'; //这个赋值成功所有没有显示 $example->protected = 'tec'; $example->private = 'vat'; $example->other = 'er'; echo '<br/>';
echo 'Print public Attributes:'.$example->public;
__isset() および __unset( )#__isset() は、オブジェクト内の属性を呼び出すか、非クラス内の属性を呼び出します。isset() メソッドを使用するとき、属性が存在しないか非パブリックの場合は, isset() メソッドが自動的に実行されます。
__unset() はオブジェクト内の属性を呼び出すか、非クラス内の属性を呼び出します。unset() メソッドを使用します。 public 属性を指定すると、__unset() の呼び出しが自動的に実行されます。呼び出すことができないメンバー属性の削除が可能です。このメソッドがクラスに追加されていない場合、 オブジェクト内のプライベート メンバーは削除できません. 最初に少しだけ説明しましょう:<?php /** * 针对类中的魔术方法 __isset() 和 __unset() 的例子 */ class Example { public $public; protected $protected; private $private; public function __construct(){ $this->public = 'pub'; $this->protected = 'pro'; $this->private = 'pri'; } public function __isset($var){ echo '这里通过__isset()方法查看属性名为 '.$var."\n"; } public function __unset($var){ echo '这里通过__unset()方法要销毁属性名为 '.$var."\n"; } } $exa = new Example; echo '<pre class="brush:php;toolbar:false">'; var_dump(isset($exa->public)); echo "\n"; var_dump(isset($exa->protected)); echo "\n"; var_dump(isset($exa->private)); echo "\n"; var_dump(isset($exa->noVar)); echo "\n"; echo '<hr/>'; unset($exa->public); var_dump($exa); echo "\n"; unset($exa->protected); echo "\n"; unset($exa->private); echo "\n"; unset($exa->noVar); echo "\n";
<?php class Connection { protected $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() { return array('server', 'username', 'password', 'db'); } public function __wakeup() { $this->connect(); } } ?>
オブジェクトを文字列として扱う場合の応答メソッド。たとえば、オブジェクト
<?php // Declare a simple class class TestClass { public function __toString() { return 'this is a object'; } } $class = new TestClass(); echo $class; ?>
__invoke()
関数を呼び出してオブジェクトを呼び出すときの応答メソッド。次のように######<?php class CallableClass { function __invoke() { echo 'this is a object'; } } $obj = new CallableClass; var_dump(is_callable($obj)); ?>
この静的メソッドは、クラスをエクスポートするために var_export() を呼び出すときに呼び出されます。
<?php class A { public $var1; public $var2; public static function __set_state ($an_array) { $obj = new A; $obj->var1 = $an_array['var1']; $obj->var2 = $an_array['var2']; return $obj; } } $a = new A; $a->var1 = 5; $a->var2 = 'foo'; var_dump(var_export($a)); ?>
__clone()
オブジェクトのコピーが完了すると呼び出されます。例えば、記事「デザインパターンとPHP実装の詳細解説:シングルトンモード」で紹介したシングルトンモードの実装方法では、オブジェクトの複製を防ぐためにこの機能が使用されています。
<?php public class Singleton { private static $_instance = NULL; // 私有构造方法 private function __construct() {} public static function getInstance() { if (is_null(self::$_instance)) { self::$_instance = new Singleton(); } return self::$_instance; } // 防止克隆实例 public function __clone(){ die('Clone is not allowed.' . E_USER_ERROR); } } ?>
マジック定数
PHP の定数のほとんどは変更されませんが、コード内の位置が変わると変更される定数が 8 つあります。これらの 8 つの定数はマジック定数と呼ばれます。
__LINE__、ファイル内の現在の行番号
__FILE__、ファイルの完全なパスとファイル名
__DIR__、ファイルが配置されているディレクトリ
__FUNCTION__、関数名
__CLASS__、クラス名
__TRAIT__、トレイト名
__METHOD__、クラスメソッド名
__NAMESPACE__、現在のネームスペースの名前
これらのマジック定数は、現在の環境情報を取得したり、ログを記録したりするためによく使用されます。
関連する推奨事項:
PHP で一般的に使用されるいくつかのマジック メソッド [php クラスとオブジェクト]マジック メソッド以上がphpの魔法のメソッドとは何ですか? phpマジックメソッドの使い方のまとめ(コード)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。