php のマジック メソッドには、「__set()」、「__get()」、「__isset()」、「__unset()」、「__sleep()」、「__wakeup()」、「__call( )」、「__invoke()」、「__set_state()」など。
このチュートリアルの動作環境: Windows7 システム、PHP7.1 バージョン、DELL G3 コンピューター
オブジェクト指向プログラミングでは、PHP が提供します。一連のマジック メソッド。これらのマジック メソッドはプログラミングに非常に便利であり、PHP におけるその役割は非常に重要です。 PHP のマジック メソッドは通常、__ (2 つのアンダースコア) で始まり、明示的に呼び出す必要はありませんが、特定の条件下で自動的に呼び出されます。
PHP のマジック メソッドは次の表に示されています。
マジック メソッド | Function |
---|---|
__construct() | クラスのインスタンス化時に自動的に呼び出されます |
__destruct() | クラス オブジェクトの使用が終了したときに自動的に呼び出されます |
#set() | 未定義のプロパティに値を割り当てるときに自動的に呼び出されます |
未定義と呼ばれる | |
isset() または empty() 関数を使用すると自動的に呼び出されます | |
#__sleep() | |
__wakeup() | |
__call() | |
#__callStatic() | |
__toString() | |
__invoke() | |
__set_state() | |
__clone() | |
__debugInfo() | |
__autoload() | |
未定義のクラスをロードしようとしました |
例これらの魔法のメソッドの使用方法を例の形で説明しましょう。 1. __construct()、クラスのコンストラクター関数php のコンストラクター メソッドは、オブジェクトの作成後にオブジェクトによって自動的に呼び出される最初のメソッドです。すべてのクラスにはコンストラクターがありますが、明示的に宣言されていない場合、デフォルトでクラス内にパラメーターがなく空のコンテンツを持つコンストラクターが存在します。 1. コンストラクターの役割 通常、コンストラクターは、オブジェクトの作成時にメンバー プロパティに初期値を割り当てるなど、いくつかの便利な初期化タスクを実行するために使用されます。 2. クラスでのコンストラクター メソッドの宣言形式 function __constrct([参数列表]){ 方法体 //通常用来对成员属性进行初始化赋值 } ログイン後にコピー 3. クラスでコンストラクター メソッドを宣言する際の注意事項
<?php class Person { public $name; public $age; public $sex; /** * 显示声明一个构造方法且带参数 */ public function __construct($name="", $sex="男", $age=22) { $this->name = $name; $this->sex = $sex; $this->age = $age; } /** * say 方法 */ public function say() { echo "我叫:" . $this->name . ",性别:" . $this->sex . ",年龄:" . $this->age; } } ログイン後にコピー $Person1 = new Person(); echo $Person1->say(); //输出:我叫:,性别:男,年龄:27 ログイン後にコピー $Person2 = new Person("小明"); echo $Person2->say(); //输出:我叫:张三,性别:男,年龄:27 ログイン後にコピー $Person3 = new Person("李四","男",25); echo $Person3->say(); //输出:我叫:李四,性别:男,年龄:25 ログイン後にコピー 2 . __destruct()、クラス デストラクター上記の説明を通じて、コンストラクターが何であるかがすでにわかりました。次に、構築メソッドに相当するのがデストラクター メソッドです。 デストラクター メソッドを使用すると、クラスを破棄する前に、ファイルを閉じる、結果セットを解放するなど、一部の操作を実行したり、一部の機能を完了したりできます。 デストラクター メソッドは、PHP5 で導入された新しい内容です。 デストラクター メソッドの宣言形式は、構築メソッド__construct() function __destruct() { //方法体 } ログイン後にコピー 一般来说,析构方法在PHP中并不是很常用,它属类中可选择的一部分,通常用来完成一些在对象销毁前的清理任务。 ログイン後にコピー <?php class Person{ public $name; public $age; public $sex; public function __construct($name="", $sex="男", $age=22) { $this->name = $name; $this->sex = $sex; $this->age = $age; } /** * say 说话方法 */ public function say() { echo "我叫:".$this->name.",性别:".$this->sex.",年龄:".$this->age; } /** * 声明一个析构方法 */ public function __destruct() { echo "我觉得我还可以再抢救一下,我的名字叫".$this->name; } } $Person = new Person("小明"); unset($Person); //销毁上面创建的对象$Person ログイン後にコピー 我觉得我还可以再抢救一下,我的名字叫小明 ログイン後にコピー このメソッドには 2 つのパラメータがあります。最初のパラメータ$function_name は自動的に存在しないメソッド名を受け取り、2 番目の function __call(string $function_name, array $arguments) { // 方法体 } ログイン後にコピー 2. __call() メソッドの機能: 为了避免当调用的方法不存在时产生错误,而意外的导致程序中止,可以使用 __call() 方法来避免。 该方法在调用的方法不存在时会自动调用,程序仍会继续执行下去。 ログイン後にコピー 次のコードを参照してください: <?php class Person { function say() { echo "Hello, world!<br>"; } /** * 声明此方法用来处理调用对象中不存在的方法 */ function __call($funName, $arguments) { echo "你所调用的函数:" . $funName . "(参数:" ; // 输出调用不存在的方法名 print_r($arguments); // 输出调用不存在的方法时的参数列表 echo ")不存在!<br>\n"; // 结束换行 } } $Person = new Person(); $Person->run("teacher"); // 调用对象中不存在的方法,则自动调用了对象中的__call()方法 $Person->eat("小明", "苹果"); $Person->say(); ログイン後にコピー 実行結果: 你所调用的函数:run(参数:Array ( [0] => teacher ) )不存在! 你所调用的函数:eat(参数:Array ( [0] => 小明 [1] => 苹果 ) )不存在! Hello, world! ログイン後にコピー このメソッドは、上記の __call() 静的メソッド用に __callStatic() が用意されていない点を除けば、機能は同じです。次のコードを見てください: <?php class Person { function say() { echo "Hello, world!<br>"; } /** * 声明此方法用来处理调用对象中不存在的方法 */ public static function __callStatic($funName, $arguments) { echo "你所调用的静态方法:" . $funName . "(参数:" ; // 输出调用不存在的方法名 print_r($arguments); // 输出调用不存在的方法时的参数列表 echo ")不存在!<br>\n"; // 结束换行 } } $Person = new Person(); $Person::run("teacher"); // 调用对象中不存在的方法,则自动调用了对象中的__call()方法 $Person::eat("小明", "苹果"); $Person->say(); ログイン後にコピー 実行結果は次のとおりです: 你所调用的静态方法:run(参数:Array ( [0] => teacher ) )不存在! 你所调用的静态方法:eat(参数:Array ( [0] => 小明 [1] => 苹果 ) )不存在! Hello, world! ログイン後にコピー PHP オブジェクト指向プログラミングでは、クラスのメンバー属性がprivate に設定された後、それを外部から呼び出そうとすると、「クラスにアクセスできません」というエラーが発生します。プライベート属性」が表示されます。したがって、この問題を解決するには、魔法のメソッド
姓名:小明 年龄:50 ログイン後にコピー
次のデモ コードを参照してください: <?php class Person { private $name; private $age; public function __construct($name="", $age=25) { $this->name = $name; $this->age = $age; } /** * 声明魔术方法需要两个参数,真接为私有属性赋值时自动调用,并可以屏蔽一些非法赋值 * @param $property * @param $value */ public function __set($property, $value) { if ($property=="age") { if ($value > 150 || $value < 0) { return; } } $this->$property = $value; } /** * 在类中声明说话的方法,将所有的私有属性说出 */ public function say(){ echo "我叫".$this->name.",今年".$this->age."岁了"; } } $Person=new Person("小明", 25); //注意,初始值将被下面所改变 //自动调用了__set()函数,将属性名name传给第一个参数,将属性值”李四”传给第二个参数 $Person->name = "小红"; //赋值成功。如果没有__set(),则出错。 //自动调用了__set()函数,将属性名age传给第一个参数,将属性值26传给第二个参数 $Person->age = 16; //赋值成功 $Person->age = 160; //160是一个非法值,赋值失效 $Person->say(); //输出:我叫小红,今年16岁了 ログイン後にコピー 実行結果: 我叫小红,今年16岁了 ログイン後にコピー と呼ばれます。このメソッドを説明する前に、isset() 関数のアプリケーションを見てみましょう。この関数は変数をパラメータとして渡し、渡された変数が存在する場合は true を返し、それ以外の場合は false を返します。 状況は 2 つあります。オブジェクト内のメンバーがパブリックである場合、この関数を使用してメンバー属性を測定できます。メンバーがプライベートなメンバー属性である場合、この関数は機能しません。その理由は、オブジェクト内のメンバーがパブリックである場合、この関数は機能しません。 private. カプセル化されており、外部からは見えません。では、オブジェクトの外部で メソッドを追加することだけです。クラス外で
|
以上がphpの魔法のメソッドとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。