從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時呼叫的,例如
view plain
copy to clipboard
print?
<?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則是訪問和設定類不存在的成員變數時呼叫的。
這三個的函式原型如下:
view plain
copy to clipboard
print?
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的例子:
view plain
copy to clipboard
print?
<?php
class caller
}
$foo = new caller();
$foo->test(1, 2);
?>
<?php
class caller
}$foo = new caller();
$foo->test(1, 2);
?>
上例將輸出:
method test called:
array
([0] => 1
[1] => 2
)__get 和 __set 的例子:
view plain
copy to clipboard
print?
<?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其實原理是差不多的,他們的原型如下:
view plain
copy to clipboard
print?
bool __isset(string $name)
void __unset(string $name)
bool __isset(string $name)
void __unset(string $name)
舉個例子:
view plain
copy to clipboard
print?
<?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);
?>
<?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這個魔術方法就會呼叫它。
舉例如下:
view plain
copy to clipboard
print?
<?php
class a
}
$a = new a;
$b = $a; // $b只是$a的引用,不是轉殖,所以不呼叫__clone,沒任何輸出。
$c = clone $a; // 呼叫了__clone,將輸出 object cloned
?>
php的魔術函式(魔術方法)
construct 類的建構函式 destruct 類的析構函式 call 在物件中呼叫乙個不可訪問方法時呼叫 callstatic 用靜態方式中呼叫乙個不可訪問方法時呼叫 get 獲得乙個類的成員變數時呼叫 set 設定乙個類的成員變數時呼叫 isset 當對不可訪問屬性呼叫isset 或empt...
php魔術常量,魔術方法
魔術常量 1。line 返回檔案中的當前行號。2。file 返回檔案的完整路徑和檔名。如果用在包含檔案中,則返回包含檔名。自php4.0.2 起,file 總是包含乙個絕對路徑,而在此之前的版本有時會包含乙個相對路徑。3。function 返回函式名稱 php4.3.0 新加 自php5 起本常量返...
invoke 魔術 PHP 魔術方法
php 魔術方法 構造方法 construct 析構方法 destruct get 與 set unset call 和 callstatic sleep 和 wakeup clone tostring invoke set state debuginfo construct 這個方法應該是最常用的...