ホームページ >php教程 >php手册 >PHPマジック関数の使用手順

PHPマジック関数の使用手順

WBOY
WBOYオリジナル
2016-06-13 12:18:551110ブラウズ

マジック関数とは何ですか?
__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 は、存在しないプロパティを読み取ろうとしたときに呼び出されます。

__set は、存在しないプロパティに値を書き込もうとするときに呼び出されます。
__isset は、存在しないプロパティを検出しようとすると呼び出されます。
__unset は、存在しないプロパティの設定を解除しようとすると呼び出されます。


コードをコピーします コードは次のとおりです。

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 の違い。




コードをコピー

コードは次のとおりです。


class test3 {
public $name = "steven";
public $id = "1";

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();

print $t4;
print_r($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');

__set_state() は、var_export を使用してインスタンスをエクスポートするときに呼び出されます。このメソッドには、エクスポートされたインスタンスが所有する
というパラメーターがあります。メンバー属性の配列

コードをコピー コードは次のとおりです:

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);


注:

1. オブジェクト間の割り当ては常にアドレス参照によって渡されます。 >2 。実際の値として渡したい場合は、clone キーワードを使用する必要があります。
3 クローンは単なるインスタンスです。インスタンス内のメンバー属性もインスタンスである場合、このメンバー属性は参照メソッド
を使用して新しいインスタンスに渡されます。
// オブジェクト間の代入は常にアドレス参照で渡されます。 $t71 $t72 の age 属性は同じです。



コードは次のとおりです。 :

クラス 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 {

public $age = 10;
public $sub = null;

クラス 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;

}
}
$i2 = new test76();
$i2->sub = new test75(); 🎜>$i2->gt;sub->age = 15;

var_dump($i3-> __autoload() 関数。 、対応するクラスが存在しない場合は、

コードをコピーします

コードは次のとおりです:


function __autoload($class) {
if ( $class == "test8" ){
require_once dirname(__FILE__).'/class8.php'
}
}
spl_autoload( );
$t8 = 新しい test8;

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。