ホームページ >バックエンド開発 >PHPチュートリアル >PHP マジック メソッドの使用例_PHP チュートリアル
この記事では主に、__get、__set、__call、__callStatic、__toString、__invoke などのマジック メソッドの使用例を説明します。参考
① __get/__set: オブジェクトのプロパティを引き継ぎます
存在しないオブジェクトのプロパティにアクセスする場合:
index.php
コードは以下の通りです:
define('BASEDIR',__DIR__); //ルートディレクトリ定数を定義します
BASEDIRをインクルードします。'/Common/Loader.php';
spl_autoload_register('\Common\Loader::autoload');
$obj = new CommonObject();
//phpで存在しないオブジェクトのプロパティにアクセスする場合
echo $obj->title;
エラーがスローされます: Notice: Unknown property: CommonObject::$title in D:practisephpdesignpsr0index.php on line 9
Common/Object.phpに__setメソッドと__getメソッドを追加した後
Object.php
コードは以下の通りです:
名前空間 Common;
クラスオブジェクト{
関数__set($key,$value){
}
関数__get($key){
}
}
index.phpを再度実行すると、エラーは報告されなくなります。
Common/Object.phpを再度修正します
コードは以下の通りです:
名前空間 Common;
クラスオブジェクト{
protected $array = array();
関数__set($key,$value){
var_dump(__METHOD__);
$this->array[$key] = $value;
}
関数__get($key){
var_dump(__METHOD__);
return $this->array[$key];
}
}
index.php
コードは次のとおりです:
define('BASEDIR',__DIR__); //ルートディレクトリ定数を定義します
BASEDIRをインクルードします。'/Common/Loader.php';
spl_autoload_register('\Common\Loader::autoload');
$obj = new CommonObject();
$obj->title = 'こんにちは';
echo $obj->title;
Index.php を実行、ページ出力:
コードは次のとおりです:
文字列 'CommonObject::__set' (長さ=20)
文字列 'CommonObject::__get' (長さ=20)
こんにちは
② __call/__callStatic: PHP オブジェクトのメソッドの呼び出しを制御します (__callStatic はクラスの静的メソッドの制御に使用されます)
存在しないphpメソッドを実行する場合
index.php:
コードは以下の通りです:
define('BASEDIR',__DIR__); //ルートディレクトリ定数を定義します
BASEDIRをインクルードします。'/Common/Loader.php';
spl_autoload_register('\Common\Loader::autoload');
$obj = new CommonObject();
//存在しないphpメソッドを実行する場合
$obj->test('hello',123);
index.php を実行すると、致命的なエラーが報告されます: Fatal error: Call to un 未定義メソッド CommonObject::test() in D:practisephpdesignpsr0index.php on line 9
Common/Object で __call メソッドを定義すると、メソッドが存在しないときに自動的にコールバックされます。
コードは以下の通りです:
名前空間 Common;
クラスオブジェクト{
function __call($func, $param){ //$funcメソッド名$paramパラメータ
var_dump($func, $param);
return "magic functionn"; // 戻り値として文字列を返します
}
}
index.php
コードは以下の通りです:
define('BASEDIR',__DIR__); //ルートディレクトリ定数を定義します
BASEDIRをインクルードします。'/Common/Loader.php';
spl_autoload_register('\Common\Loader::autoload');
$obj = new CommonObject();
//存在しないphpメソッドを実行する場合
echo $obj->test('hello',123);
ページ出力:
コードは以下の通りです:
文字列「テスト」(長さ=4)
配列
0 => 文字列 'hello' (長さ=5)
1 => int 123
魔法の機能
存在しない静的メソッドを呼び出す場合
Common/Object.php
コードは以下の通りです:
名前空間 Common;
クラスオブジェクト{
静的関数 __callStatic($name, $arguments) {
var_dump($name, $arguments);
return "magic functionn"; // 戻り値として文字列を返します
}
}
注: __callStatic メソッドも静的メソッドとして宣言する必要があります
index.php
コードは以下の通りです:
define('BASEDIR',__DIR__); //ルートディレクトリ定数を定義します
BASEDIRをインクルードします。'/Common/Loader.php';
spl_autoload_register('\Common\Loader::autoload');
//存在しない静的メソッドを実行する
echo CommonObject::test("hello",1234);
Index.php を実行、ページ出力:
コードは次のとおりです:
文字列「テスト」(長さ=4)
配列
0 => 文字列 'hello' (長さ=5)
1 => int 1234
魔法の機能
③ __toString: PHPオブジェクトを文字列に変換します
index.php
コードは以下の通りです:
define('BASEDIR',__DIR__); //ルートディレクトリ定数を定義します
BASEDIRをインクルードします。'/Common/Loader.php';
spl_autoload_register('\Common\Loader::autoload');
$obj = new CommonObject();
echo $obj;
この時点でエラーが報告されます: キャッチ可能な致命的なエラー: CommonObject クラスのオブジェクトを D:practisephpdesignpsr0index.php の 8 行目で文字列に変換できませんでした
Object.phpに__toStringメソッドを追加します
コードは以下の通りです:
名前空間 Common;
クラスオブジェクト{
関数__toString() {
__CLASS__を返す;
}
}
④ __invoke: PHPオブジェクトが関数として実行されると、このマジックメソッドがコールバックされます
index.php
コードは次のとおりです:
define('BASEDIR',__DIR__); //ルートディレクトリ定数を定義します
BASEDIRをインクルードします。'/Common/Loader.php';
spl_autoload_register('\Common\Loader::autoload');
$obj = new CommonObject();
echo $obj("test");
Object.php
コードは以下の通りです:
名前空間 Common;
クラスオブジェクト{
関数__invoke($param) {
var_dump($param);
「invoke」を返す;
}
}
ページ出力:
コードは次のとおりです:
文字列「テスト」(長さ=4)
呼び出す
。