マジック関数とは何ですか?
__set() __get() など、__ で始まる関数はマジック関数と呼ばれます。
は設定時に存在しません。
どのようなマジック関数がありますか?
一般に、次のようなマジック関数があります。
__construct() __destruct() __get() __set() __isset() __unset() __call () __callStatic()
__sleep() __wakeup() __toString() __set_state() __clone() __autoload()
__construct() オブジェクトがインスタンス化されると、オブジェクトのこのメソッドが最初に呼び出されます。
__destruct() このメソッドは、オブジェクトを削除するとき、またはオブジェクトの操作が終了するときに呼び出されます。
コードをコピーします コードは次のとおりです。
class test1 {
public function __construct() {
var_dump(__function__ );
}
パブリック関数 __destruct() {
var_dump(__function__);
}
$t1 = new test1; );
__get は、存在しないプロパティを読み取ろうとしたときに呼び出されます。
コードをコピーします コードは次のとおりです。
class test2 {public $name3; __set($ key, $value) {
var_dump(__function__. '
KEY:'
.$key.'
Value:'
.$value); 🎜>パブリック関数 __get($key) {
var_dump(__function__. 'KEY:'.$key);
}
パブリック関数 __isset($key) {
var_dump(__function__. 'KEY) :'.$key);
パブリック関数 __unset($key) {
var_dump(__function__.' KEY:'.$key);
}
$ t =新しいテスト2;
$t->name2;
$t->name3; );
isset($t->name3);
unset($t->name4);
__sleep はオブジェクトのシリアル化時に呼び出されます。オブジェクトに対して
を呼び出す際の注意点:
1. __sleep() は配列またはオブジェクトを返す必要があり (通常は $this が返されます)、戻り値はシリアル化された
値として使用されます。
この値が返されない場合、シリアル化は失敗します。これは、逆シリアル化によって __wakeup イベントがトリガーされないことも意味します。
2. シリアル化では、デフォルトで割り当てられた属性が保存されます。インスタンス化によってコンテンツを割り当てる場合は、
によって返される配列の
に属性を指定する必要があります。 $id と $id2 の違い。
public function __sleep() { var_dump(__function__); // 戻り値がありません。逆シリアル化も失敗しました // return array("name"); // 戻り値があります。逆シリアル化は成功しました。 // return array("name", "id2"); // シリアル化は成功しました。戻り値はあります。id2 属性は復元できません。 public function testEcho(); var_dump($this->name);
var_dump ($this->id2);}
パブリック関数 __wakeup() 🎜>var_dump(__function__);
$this-> ;testEcho();
}
$t3= 新しい test3 ;
$t3->id2 = uniqid();
$t3s = Serialize($t3);
unserialize($t3s);
__toString オブジェクトを直接印刷する場合、このメソッドが呼び出されます
コードをコピー
コードは次のとおりです。
class test4 {
public function __toString() {
return "toString";
}
$t4();
存在しないメソッドを呼び出そうとすると、__call($func, $param ) が呼び出されます。このメソッドには 2 つのパラメータが必要です。最初のパラメータは呼び出されるメソッドの名前です。 2 番目は呼び出されたメソッドのパラメータ配列です。 サブクラス内の親クラスのプライベート メソッドを呼び出す場合、またはインスタンス内のクラス の非保護メソッドを呼び出す場合、__call() は呼び出されないことに注意してください
コードをコピーします
コードは次のとおりです:
class test5 {
public function __call($func, $param) {
var_dump( '関数:'.$func);
var_dump($param);
$t5 = 新しい test5; ',' xx','xx');
存在しない静的メソッドを呼び出そうとすると、__callStatic() が呼び出されます。
このメソッドには 2 つのパラメータが必要です。1 つ目は呼び出されるメソッドの名前で、2 つ目は呼び出されるメソッドのパラメータ配列です。
PHP5.3 で登場
コードをコピー コードは次のとおりです。
class test51 {
public function __callStatic ($fun, $param) {
var_dump('Function:'.$func);
}
}
test51::test(' xx' ,'xx','xx');
コードをコピー コードは次のとおりです:
class test6 {
public function __set_state ($arr) {
var_dump($arr);
}
}
$t6 = 新しい test6;
$t6->age = "12"; $t6, true );
var_export($t6);
eval('
$b='
.var_export($t6,true);
print_r($b);
注:
クラス test71 { public $age = 10; $t71 = new test71(); $t72 = $t71; ($t71->age) ;
$t71->age =12 ;var_dump($t72->age) ;実際の値として渡すには、clone キーワード $t73 = clone $t71; $t71->age = 13; var_dump($t71->age); を使用する必要があります。 -> ;age) ; // インスタンス内のメンバー プロパティもインスタンスである場合、このメンバー プロパティは参照によって新しいインスタンスに渡されます。
コードをコピー
コードは次のとおりです。
class test74 {
クラス test75 { public $age = 11; $i- >sub = new test75(); $i1 =clone $i; var_dump($i1->sub->age); 12;
var_dump($i1->sub->age);
// $i と $i1 は同じインスタンスを指しますが、そのメンバー属性 $sub は指します同じインスタンスに。このとき、
__clone メソッドを使用して $sub をコピーする必要があります。 // $i2 と $3 は異なるインスタンスを指します。メンバー属性 $sub も異なるインスタンスを指します。
コードをコピーします。
コードは次のとおりです。 >
class test76 {
public $age = 10;
public $sub = null;
$this->sub = clone $this; ->sub;
var_dump($i3-> __autoload() 関数。 、対応するクラスが存在しない場合は、
コードをコピーします
コードは次のとおりです:
function __autoload($class) {
if ( $class == "test8" ){
require_once dirname(__FILE__).'/class8.php'
}
}
spl_autoload( );
$t8 = 新しい test8;