php 魔術方法:構造方法__construct()、析構方法__destruct()、__get () 與__set ()、__unset()、__call() 和 __callstatic()、__sleep() 和 __wakeup()、__clone()、__tostring()、__invoke()、__set_state()、__debuginfo()
__construct()
這個方法應該是最常用的,被稱為構造器或者構造方法,當乙個物件被例項化時會被首先呼叫,而在 php 框架中一些過濾器,中介軟體及依賴注入也一般在這個方法中完成。父類的構造器可以被子類繼承和重寫。
class a \n";
if($attribute == 'name') \",\"value\" => \"\" }\n";
$this->$attribute = $value;
$a = new a;
echo $a->***."\n";
echo $a->name."\n";
if(!$a->age)
__isset()
當對不可訪問屬性呼叫 isset() 或 empty() 時,__isset() 會被呼叫。
class a \n";
if($name == 'name')\n";
class b
thrown in /users/mac/code/test/index.php on line 22
正常情況下如果 對乙個不可訪問的屬性執行 unset 時 php 會丟擲致命錯誤,而使用__unset()方法我們可以替換一些更友好的提示或者記錄錯誤呼叫日誌資訊、將使用者重定向、丟擲異常等等,亦或者是如同 set 和 get 那樣做方法的重新命名。
__call() 和 __callstatic()
call 和 callstatic 是類似的方法,前者是呼叫類不存在的方法時執行,而後者是呼叫類不存在的靜態方式方法時執行。正常情況下如果呼叫乙個類不存在的方法 php 會丟擲致命錯誤,而使用這兩個魔術方法我們可以替換一些更友好的提示或者記錄錯誤呼叫日誌資訊、將使用者重定向、丟擲異常等等,亦或者是如同 set 和 get 那樣做方法的重新命名。
class a
public static function __callstatic($name, $arguments)
var_dump($name);
var_dump($arguments);
echo 'unknown static method ' . $name;
function __call($name, $arguments)
var_dump($name);
var_dump($arguments);
echo 'unknown method ' . $name;
$a = new a();
$a->function([123,3213]);//呼叫不存在的普通方法
a::static();//呼叫不存在的靜態方法
__sleep() 和 __wakeup()
當我們執行 serialize() 和 unserialize() 對物件進行操作是時,會呼叫這兩個方法,比如物件有乙個資料庫鏈結,想要在反序列化時恢復鏈結狀態,而在序列化時希望將屬性鍵名儲存就可以使用這兩個魔術方法:
class connection
protected $link;
private $server, $username, $password, $db;
public function __construct($server, $username, $password, $db)
$this->server = $server;
$this->username = $username;
$this->password = $password;
$this->db = $db;
$this->connect();
private function connect()
$this->link = mysql_connect($this->server, $this->username, $this->password);
mysql_select_db($this->db, $this->link);
public function __sleep()
return array('server', 'username', 'password', 'db');
public function __wakeup()
$this->connect();
__clone()
如同名字一樣,這個方法在物件被複製時呼叫,如我們要實現乙個單例模式,我們可以用這個魔術方法防止物件被轉殖。
public class singleton
public static function getinstance() {
if (is_null(self::$_instance)) {
self::$_instance = new singleton();
return self::$_instance;
// 防止轉殖例項
public function __clone(){
die('clone is not allowed.' . e_user_error);
__tostring()
當物件被當做字串是呼叫此方法。
php 5.2.0 之前,tostring () 方法只有在直接使用於 echo 或 print 時才能生效。php 5.2.0 之後,則可以在任何字串環境生效(例如通過 printf (),使用 % s 修飾符),但不能用於非字串環境(如使用 % d 修飾符)。自 php 5.2.0 起,如果將乙個未定義 tostring () 方法的物件轉換為字串,會產生 e_recoverable_error 級別的錯誤。
// declare a ****** class
class testclass
public function __tostring() {
return 'this is a object';
class penguin {
public function __construct($name) {
$this->species = 'penguin';
$this->name = $name;
public function __tostring() {
return $this->name . " (" . $this->species . ")\n";
$class = new testclass();
echo $class;
$tux = new penguin('tux');
echo $tux;
在 testclass 的呼叫中我們輸出了乙個友好的提示,而在 penguin 我們將物件的屬性組合後輸出,比如在模板中呼叫。
__invoke()
當嘗試用函式的方式呼叫乙個物件是觸發此方法。
php 5.3.0 新增
class callableclass
function __invoke($x) {
var_dump($x);
$obj = new callableclass;
$obj(5); // int(5)
var_dump(is_callable($obj)) // bool(true)
__set_state()
呼叫 var_export () 匯出類時,此魔術方法被呼叫
php 5.1.0 新增
class a
public $var1;
public $var2;
public static function __set_state ($an_array) {
$obj = new a;
$obj->var1 = $an_array['var1'];
$obj->var2 = $an_array['var2'];
return $obj;
$a = new a;
$a->var1 = 5;
$a->var2 = 'foo';
var_dump(var_export($a));
__debuginfo()
這個方法在對物件使用 var_dump() 或者 print_r() 時呼叫。
php 5.6.0 新增
class a {
public $name = 'a';
public function __debuginfo()
echo __method__."\n";
return ;
class b{
public $name = 'b';
$instancea = new a();
$instanceb = new b();
var_dump($instancea,$instanceb);
執行結果
a::__debuginfo
object(a)#1 (0) {
object(b)#2 (1) {
["name"]=>
string(1) "b"
php魔術方法 invoke
php5.3新增了乙個叫做 invoke的魔術方法,這樣在建立例項後,可以直接呼叫物件。就是用函式的方式來用物件,比如我現在有個a類,如果我想防止別人直接輸出物件,那麼我可以這樣 class a a new a echo a 那麼就會輸出 不允許這樣使用 invoke 方法,也可以,帶引數 clas...
php魔術常量,魔術方法
魔術常量 1。line 返回檔案中的當前行號。2。file 返回檔案的完整路徑和檔名。如果用在包含檔案中,則返回包含檔名。自php4.0.2 起,file 總是包含乙個絕對路徑,而在此之前的版本有時會包含乙個相對路徑。3。function 返回函式名稱 php4.3.0 新加 自php5 起本常量返...
PHP魔術方法和魔術常量
具體的解釋如下 1。construct 例項化物件時被呼叫,當 construct和以類名為函式名的函式同時存在時,construct將被呼叫,另乙個不被呼叫。2。destruct 當刪除乙個物件或物件操作終止時被呼叫。3。call 物件呼叫某個方法,若方法存在,則直接呼叫 若不存在,則會去呼叫 c...