PHP把全部以__(兩個下劃線)開頭的類方法當成魔術方法,而且這些魔術方法的參數都不能經過引用傳遞。php的魔術方法有:
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state() 和 __clone()等。
下面簡單說一下對應的功能:
Class MyClass {
__construct($var1,$var2) {
//構造器
}
__destruct() {
//析構方法
}
__clone() {
//克隆方法 $obj2 = clone $obj1; 時執行
對象的複製
class a{
public $s = '';
}
$a_1 = new a();
$a_1->s = 'a1';
$a_2 = clone $a_1;
$a_2->s = 'a2';
echo $a_1->s; //'a1'
echo $a_2->s; //'a2'
淺度複製
class a{
public $s = '';
}
class b{
public $a = null;
public $str = null;
}
$str = '123';
$b_1 = new b();
$b_1->a = new a();
$b_1->str = & $str;
$b_1->a->s = 'b1';
$b_2 = clone $b_1;
$b_2->a->s = 'aaaaa';
$b_2->str = 'nihao';
echo $b_1->a->s;
echo "\n";
echo $b_1->str;
echo "\n";
echo $b_2->a->s;
echo "\n";
echo $b_2->str;
深度複製
class a{
public $s = '';
}
class b{
public $a = null;
public $str = null;
public function __clone(){
$b = $this->str;
$this->str = & $b;
$this->a = clone($this->a);
}
}
$str = '123';
$b_1 = new b();
$b_1->a = new a();
$b_1->str = & $str;
$b_1->a->s = 'b1';
$b_2 = clone $b_1;
$b_2->a->s = 'aaaaa';
$b_2->str = 'nihao';
echo $b_1->a->s;
echo "\n";
echo $b_1->str;
echo "\n";
echo $b_2->a->s;
echo "\n";
echo $b_2->str;
}
__call($fun,$args) {
//魔術調用 方法名和參數
if(method_exists($this, $fun.count($args))){
return call_user_func_array(array(&$this,$fun.count($args)),$args);
}else{
throw new Exception('調用了未知的方法:'.__METHOD__);
}
}
__callStatic($fun,$args) {
//魔術調用 靜態方法名和參數
//可見性未設置爲public或未聲明爲static的時候會產生一個警告 。
//本特性只在PHP 5.3.0 及以上版本有效。
與__call區別:修飾stati
}
__invoke($args) {
//把類做爲函數使用 參數
//當嘗試以調用函數的方式調用一個對象時,__invoke() 方法會被自動調用
//本特性只在PHP 5.3.0 及以上版本有效。 class Callme { public function __invoke($phone_num) { echo "Hello: $num"; } } $call = new Callme(); $call(13810688888); // "Hello: 13810688888 } __toSring() { //對象輸出 $echo $obj = new Class(); 時輸出 }
__set($var,$value) {
//設置對象屬性 $obj->var = value 賦值
//在給未定義的變量賦值時,__set() 會被調用。
}
__get($var) {
//讀取對象屬性 $obj->var 獲取
//讀取未定義的變量的值時,__get() 會被調用。
}
__isset($var) {
//判斷對象內部屬性是否存在 isset($obj->var )。
//當對未定義的變量調用isset() 或 empty()時,__isset() 會被調用。
//自PHP 5.1.0起有效
}
__unset($var) {
//釋放內部對象屬性 unset($obj->var)。
//當對未定義的變量調用unset()時,__unset() 會被調用。
//自PHP 5.1.0起有效
}
__set_state(array $args) {
//當調用var_export()時,這個靜態 方法會被調用。
//本方法的惟一參數是一個數組,其中包含按array(‘property’ => value, …)格式排列的類屬性。
//自PHP 5.1.0起有效
}
__sleep() {
//序列化前奏方法 return array($var1,$var2);
}
__wakeup() {
//反序列化前奏方法 $this->var = ‘other_value’
}
}
補充:一個類外面使用的自動加載方法:
__autoload($classname) {
require(PATH.$classname.’_class.php’);
}