從php5以後的版本,類就可以使用魔術方法了。php規定以兩個下劃線(__)開頭的方法都保留為魔術方法,所以建議大家函式名最好不用__開頭,除非是為了過載已有的魔術方法。
目前php已有的魔術方法有__construct,__destruct,__call,__get,__set,__isset,__unset,__sleep,__wakeup,__tostring,__set_state 和 __clone。
__construct和__destruct是類的建構函式和析構函式,這個大家經常會用到,相信大家都很熟悉,這裡就不多說了。
__sleep和__wakeup是序列化類的時候呼叫的。當序列化物件時,php將試圖在序列動作之前呼叫該物件的成員函式__sleep(),當使用unserialize() 恢復物件時, 將呼叫__wakeup()。
__tostring是物件被轉為string時呼叫的,例如
<?php
class str
public function __tostring()
} $class = new str( 'hello' );
echo $class ; // 這裡物件被轉 為了string,所以呼叫了__tostring
?>
<?php
class str
public function __tostring()
}$class = new str('hello');
echo $class; // 這裡物件被轉為了string,所以呼叫了__tostring
?>
上例將輸出 hello
__set_state是當用var_export()來匯出類的時候呼叫的,這個魔術函式只有乙個引數,這個引數是乙個陣列,用來指定export的時候得到的屬性。一般很少用到。
__call, __get和__set 這三個魔術方法是最常用的,當呼叫類中不存在的方法時就會呼叫__call,而__get和__set則是訪問和設定類不存在的成員變數時呼叫的。
這三個的函式原型如下:
mixed __call(string $name , array $arguments )
void __set(string $name , mixed $value )
mixed __get(string $name )
mixed __call(string $name, array $arguments)
void __set(string $name, mixed $value)
mixed __get(string $name)
__call的例子:
<?php
class caller
}$foo = new caller();
$foo->test(1, 2);
?>
public function __call( $method , $args ) } $foo = new caller(); $foo ->test(1, 2); ?>
上例將輸出:
method test called:
array
([0] => 1
[1] => 2
)__get 和 __set 的例子:
<?php
class a
public function __get( $k )
} $a = new a;
$a ->b = 1; // 成 員變數b不存在,所以會呼叫__set
$a ->c = 2; // 成 員變數c是存在的,所以不呼叫__set,無任何輸出
$d = $a ->b; // 成員變數 b不存在,所以會呼叫__get
?>
<?php
class a
public function __get($k)
}$a = new a;
$a->b = 1; // 成員變數b不存在,所以會呼叫__set
$a->c = 2; // 成員變數c是存在的,所以不呼叫__set,無任何輸出
$d = $a->b; // 成員變數b不存在,所以會呼叫__get
?>
上例將輸出:b1
the value of b is 1
__isset和__unset這兩個與__get和__set其實原理是差不多的,他們的原型如下:
bool __isset(string $name )
void __unset(string $name )
bool __isset(string $name)
void __unset(string $name)
舉個例子:
<?php
class a
public function __unset($k)
} $a = new a;
var_dump(isset($a->a)); // 成員變數a不存在,所以呼叫__isset,返回true
var_dump(isset($a->c)); // 成員變數c是存在的,沒有呼叫__isset,同樣返回true
unset($a->b); // 成員變數b不存在,呼叫__unset
var_dump($a);
?>
上例將輸出:
bool(true)
bool(true)
object(a)#1 (2)
}類複製(clone)的時候,如果有定義__clone這個魔術方法就會呼叫它。
舉例如下:
<?php
class a
} $a = new a;
$b = $a ; // $b只是$a的引用, 不是轉殖,所以不呼叫__clone,沒任何輸出。
$c = clone $a ; // 呼叫了__clone,將輸出 object cloned
?>
PHP魔術方法總結
php中的魔術方法都是以 開頭的,具有特殊作用的一些方法,可以看做php的語法糖。construct 構造器是乙個魔術方法,當物件被例項化時它會被呼叫。在乙個類宣告時它常常是第一件做的事但是沒得必要他也像其他任何方法在類中任何地方都可以宣告,構造器也能像其他方法樣繼承。如 構造方法示例,可以繼承重寫...
PHP常用魔術方法總結
常用的魔術方法有 tostring call autoload clone get set isset unset 1.tostring 用於定義輸出物件引用時呼叫 常用於列印一些物件的資訊 必須有返回值 eg 有乙個 persion類 persion per new persion echo pe...
PHP魔術方法使用總結
魔術方法是php物件導向中特有的特性。它們在特定的情況下被觸發,都是以雙下劃線開頭,你可以把它們理解為鉤子,利用模式方法可以輕鬆實現php物件導向中過載 overloading即動態建立類屬性和方法 魔術方法很多還是成對出現的,以下列出目前php中所有的模式方法。1.construct,destru...