1、__call(string $Fname, array $arguments);
在對象中調用一個不可訪問的方法時會調用該方法。用靜態方式調用一個不可訪問的方法時會調用
__callstatic()。
例: function __call($name, $argus){ $err = "Call dont exited function :".$name."("; for($i=0;$i<count($argus)-1;$i++){ $err.= gettype($argus[$i]).", "; } echo $err,gettype($argus[count($argus)-1]),")"; }
2、__construct()構造函數
如果子類中定義了構造函數,則在實例化子類的實例時就不會隱式調用父類的構造函數。要在子類的
構造函數中執行父類的構造函數:parent::__construct(); 如果子類中沒有定義構造函數,則會從父類繼承。 為了實現向后兼容,如果php 5在類中找不到__construct()並且也沒有從父類繼承的話,他就會嘗試
尋找舊式 的構造函數,也就是和類名同名的函數。
__destruct() 析構函數
在php中,沒有任何變量指向對象時,該對象占用的內存空間會被釋放,對象被銷毀。這就是php的垃
圾回收機制,防止內存溢出。
當一個php線程結束時,當前占用的所有內存空間會被釋放,所有對象會被銷毀。
class Person { public function __destruct(){ echo '析構函數現在執行了 <br />'; } } $p = new Person(); $p = null; // 析構函數在這里執行了 $p = "abc"; // 一樣的效果 for($i = 0; $i < 5; $i++){ echo "$i <br />"; }
3、__clone() 當復制完成時,如果定義了__clone()方法,則新創建的對象(復制生成的對象)中的__clone() 方法會
被調用,可用於修改屬性的值(如果有必要的話)。私有化__clone可以防止克隆該類的對象。
class B{ static $a = 1; public $b;
public function __construct(){ $this->b = ++self::$a; } public function __clone(){ $this->b = ++self::$a; } }
class A{ public $obj1; public $obj2;
public function __clone(){ //強制復制一份this->obj1 ,否則保存同一個對象 $this->obj1 = clone $this->obj1; } } $ad = new A(); $af = $ad; //clone方法會被調用 ??? $ag = clone $ad; //強制復制對象
4、__invoke() 當以調用函數的方式調用一個對象時,改魔術方法會被執行。
例: class A{ public function __invoke($x){ print_r($x); } } $test = new A(); $test(9); //此時__invoke()會被調用
5、__get(string $name)
在讀取不可訪問的屬性的值時改函數會被調用。$name 是屬性名。
__set(string $name,mixed $val) 設置不可訪問的值時會調用該方法。通過該方法可以禁止對類屬性的擴展:在沒有該方法的情況下對類對
象的一個不存在的屬性賦值相當於擴展該對象的屬性。 function __set(){} //禁止擴展該類對象的屬性
模擬java的get() 、set() 方法:
class A{ private $asd = 'as'; public function __get($name){ if(isset($name))return $this->$name; else return false; } public function __set($name,$val){ if(isset($name)) $this->$name = $val; } }
6、__isset(string $name) 當對不可訪問屬性進行isset()或empty()時,改方法會被調用。
7、當對不可訪問屬性調用 unset()時,__unset() 會被調用。
8、__sleep( void )
serivalize()函數會檢查類中是否存在魔術方法__sleep(),如果存在,該方法會先被調用,然后才執行序
列化操作。此功能可以用於清理對象,並返回一個包含對象中所有應該被序列化的變量名稱的數組。如果該方
法未返回任何內容,則NULL被序列化,並產生E_NOTICE級別的錯誤。
__sleep()常用作提交未提交的數據,或類似的數據清理工作。同時,如果有一些很大的對象,但不需要保
存全部信息,這個魔術方法就很有用。
與之相反,unserivalize()會檢查是否存在一個__wakeup()方法,如存在則先調用改方法,預先准備對象
需要的資源。
calss Connection{
private $server,$user,$password,$db; protected $link;
public function __construct($server,$user,$password,$db){ $this->server = $server; $this->password = $password; $this->db = $db; $this->user = $user; $this->connect(); }
public function connect(){ $this->link = mysql_connect($this->server,$this->user,$this->password); mysql_select_db($this->db,$this->link); }
public function __sleep(){ return array('server','user','password','db'); //要保存的屬性 }
public function __wakeup(){ $this->connect(); //要預備的資源,重新進行數據庫鏈接,或一些其他的初始化操作。 } }
9、自動加載 __autoload
function __autoload($className){ require './'.$className; }
