ホームページ  >  記事  >  バックエンド開発  >  PHP マジック メソッドの使用例、php マジックの例_PHP チュートリアル

PHP マジック メソッドの使用例、php マジックの例_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 09:48:43788ブラウズ

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;

エラーがスローされます: Notice: Unknown property: CommonObject::$title in D:practisephpdesignpsr0index.php on line 9

Common/Object.phpに__setメソッドと__getメソッドを追加した後

オブジェクト.php


コードをコピーします コードは次のとおりです: 名前空間共通;

クラスオブジェクト{

関数 __set($key,$value){
}

関数 __get($key){
}
}

index.php を再度実行すると、エラーは報告されなくなります。

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 = 新しい CommonObject();

$obj->title = 'こんにちは';

echo $obj->title;



index.phpを実行、ページ出力:


コードをコピーします コードは次のとおりです: 文字列 'CommonObject::__set' (長さ=20) 文字列 'CommonObject::__get' (長さ=20)
こんにちは


② __call/__callStatic: PHP オブジェクトメソッドの呼び出しを制御します (__callStatic はクラスの静的メソッドを制御するために使用されます)

存在しないphpメソッドを実行する場合

index.php:


コードをコピーします コードは次のとおりです: define('BASEDIR',__DIR__); //ルートディレクトリ定数を定義します
include BASEDIR.'/Common/Loader.php';
spl_autoload_register('\Common\Loader::autoload');

$obj = 新しい CommonObject();

//存在しないphpメソッドを実行する場合

$obj->test('hello',123);


index.php を実行すると、致命的なエラーが報告されます: 致命的なエラー: D:practisephpdesignpsr0index.php の 9 行目で未定義メソッド CommonObject::test() を呼び出します

Common/Object で __call メソッドを定義すると、メソッドが存在しないときに自動的にコールバックされます。

コードをコピーします
コードは次のとおりです: 名前空間共通;
クラスオブジェクト{
Function __call($func, $param){ //$func メソッド名 $param パラメータ

var_dump($func, $param);

return "magic functionn" // 戻り値として文字列を返します
}
}


index.php

コードをコピーします

コードは次のとおりです: define('BASEDIR',__DIR__); //ルートディレクトリ定数を定義します include BASEDIR.'/Common/Loader.php';
spl_autoload_register('\Common\Loader::autoload');

$obj = 新しい CommonObject();
//存在しないphpメソッドを実行する場合

echo $obj->test('hello',123);

ページ出力:

コードをコピーします


コードは次のとおりです: 文字列「テスト」(長さ=4) 配列 0 => 文字列 'hello' (長さ=5) 1 => int 123
魔法の関数


存在しない静的メソッドを呼び出す場合

Common/Object.php

コードをコピーします

コードは次のとおりです: 名前空間共通; クラスオブジェクト{
静的関数 __callStatic($name, $arguments) {
var_dump($name, $arguments);

return "magic functionn" // 戻り値として文字列を返します。 }

}

注: __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)
呼び出す

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/1021094.html技術記事 PHPマジックメソッドの使用例、PHPマジック例① __get/__set: 存在しないオブジェクトのプロパティにアクセスする場合:index.php 以下のコードをコピーします。...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。