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