本篇文章主要介紹了淺談PHP中的物件導向OOP中的魔術方法 ,具有一定的參考價值,感興趣的小夥伴們可以參考一下
一、什麼是魔術方法:
PHP為我們提供了一系列用開頭的函數,這些函數無需自己手動調用,會在合適的時機自動調用,這類函數稱為魔術函數。
例如:
function construct(){} 在new一個新對象時自動調用此函數
二、PHP中都有那些魔術方法,以及它們的作用:
1.construct():建構函式,new對象時自動調用
eg:
class Person{ public $name; public $age; function construct($name,$age){ $this->name=$name; $this->age=$age; }}
在new新的Person對象時會自動調用construct()函數,將傳入的參數分別賦給$name,$age。
2.destruct():解構函式,當一個對象被銷毀前自動調用
class Person{ public $name; public $age; function destruct(){ echo "這個對象被銷毀了"; }}
同上所述,對象被銷毀時執行此魔術方法
3.get():訪問類中私人屬性時自動調用,傳遞讀取屬性名稱,返回$this->屬性名稱
class Person{ private $name; public $age; function get($name){ return $this->$name; }}
如上代碼,$name被設為私人屬性後不能直接通過$this->name;的方式讀取,因此需要設定get()魔術方法來讀取。
4.set():給類的私人屬性賦值時自動調用,傳遞需設定的屬性名稱,屬性值
class Person{ private $name; public $age; function set($key,$value){ $this->$key=$value; }}
同get()方法,私人屬性不能通過$this->name="aaa";的方式直接設定,需要設定set()方法,傳入的參數分別是屬性名稱和屬性值。
5.isset():使用isset檢測對象私人屬性時調用,傳遞檢測的屬性名稱,返回isset($this->屬性名稱)
class Person{ private $name; public $age; function isset($name){ return isset($this->$name); }}
使用isset檢測對象私人屬性時調用,其他同上。
6.unset():使用unset()函數刪除對象私人屬性時調用,傳遞刪除的屬性名稱,方法中執行unset($this->屬性名稱)
class Person{ private $name; public $age; function unset($name){ unset($this->$name); }}
同上,在用unset()函數刪除私人屬性時調用。
7.toString():使用echo列印對象時調用,返回列印對象時想要顯示的內容,返回必須是字串
class Person{ public $name; public $age; function toString(){ $str = <<<str 您要列印的內容是:<br> \$name=>{$this->name};<br> \$age=>{$this->age};<br>str; return $str; }}
使用echo列印對象時調用,返回列印對象時想要顯示的內容。
8.call():調用一個類中未定義的或未公開的方法時自動調用,傳遞被調用的函數名及參數列表
class Person{ public $name; public $age; function call($funcName,$funcParams){ echo "您調用的函數{$funcName},參數列表"; print_r($funcParams); echo "不存在/未公開"; }}$zhangsan=new Person();$zhangsan->say(1,2,3);
如代碼所示,調用不存在的say(1,2,3);時,會列印
您調用的函數way,參數列表Array ( [0] => 123 ) 不存在
9.clone():當使用clone關鍵字,複製一個對象時自動調用,作用是為新複製的對象初始化賦值
class Person{ public $name; public $age; function clone(){ $this->name="lisi"; }} $zhangsan=new Person("zhangsan",24);$lisi=clone $zhangsan;echo $lisi->name;
列印出的結果是"lisi",而不是"zhangsan"。
10.sleep():對象序列化時自動調用,返回一個數組,數組中的值就是可以序列化的屬性
class Person{ public $name; public $age; function sleep(){ return array("name","age"); }}
如上述代碼,在用serialize()序列化對象時只有"name","age"屬性會被序列化。
11.wakeup():對象還原序列化時自動調用,為還原序列化新產生的對象進行初始化賦值
class Person{ public $name; public $age; function wakeup(){ $this -> name = "lisi"; }}
將對象序列化後再還原序列化,同時給對象的name屬性賦初值為"lisi"。
12.autolode():需要在類外部聲明函數,當執行個體化一個未聲明的類時自動調用,傳遞執行個體化的類名,可以使用類名自動載入對應的類檔案。
function autoload($className){ include "class/".strtolower($className).".class.php";} $zhangsan=new Person();$zhangsan->say();
如上述代碼,Person類不存在時調用autolode()方法,載入寫在檔案外的類,"class/".strtolower($className).".class.php";就是類檔案的相對路徑,$className就是
不在本檔案中的類的類名,因此在建立外部類檔案時命名方式必須是小寫類名.class.php。autolode()方法也是惟一一個不用寫在類中的魔術方法。