概述
在面向?qū)ο缶幊讨校琍HP提供了一系列的魔術(shù)方法,這些魔術(shù)方法為編程提供了很多便利。PHP中的魔術(shù)方法通常以__(兩個下劃線)開始,并且不需要顯示的調(diào)用而是由某種特定的條件出發(fā)。這篇文章簡單總結(jié)了PHP中提供的魔術(shù)方法。
開始之前
在總結(jié)PHP的魔術(shù)方法之前先來定義兩個類,以便后邊示例使用:
代碼如下:
class Device {
public $name;
public $battery;
public $data = array();
public $connection;
protected function connect() {
$this->connection = 'resource';
echo $this->name . ' connected' . PHP_EOL;
}
protected function disconnect() {
$this->connection = null;
echo $this->name . ' disconnected' . PHP_EOL;
}
}
class Battery {
private $charge = 0;
public function setCharge($charge) {
$charge = (int)$charge;
if($charge < 0) {
$charge = 0;
}
elseif($charge > 100) {
$charge = 100;
}
$this->charge = $charge;
}
}
?>
Device類有四個成員屬性和兩個成員方法。Battery類有一個成員屬性和一個成員方法。
構(gòu)造函數(shù)和析構(gòu)函數(shù)
構(gòu)造函數(shù)和析構(gòu)函數(shù)分別在對象創(chuàng)建和銷毀時被調(diào)用。對象被“銷毀”是指不存在任何對該對象的引用,比如引用該對象的變量被刪除(unset)、重新賦值或腳本執(zhí)行結(jié)束,都會調(diào)用析構(gòu)函數(shù)。
__construct()
__construct()構(gòu)造函數(shù)是目前為止最經(jīng)常使用的函數(shù)。在創(chuàng)建對象時,可以在構(gòu)造函數(shù)中做一些初始化工作。可以為構(gòu)造函數(shù)定義任意多個參數(shù),只要在實例化時傳入對應個數(shù)的參數(shù)即可。構(gòu)造函數(shù)中出現(xiàn)的任何異常都會阻止對象的創(chuàng)建。
代碼如下:
class Device {
public function __construct(Battery $battery, $name) {
$this->battery = $battery;
$this->name = $name;
$this->connect();
}
}
上面的示例代碼中,Device類的構(gòu)造函數(shù)為成員屬性賦值并且調(diào)用了connect()方法。
代碼如下:
將構(gòu)造函數(shù)聲明為私有方法,可以防止在類外部創(chuàng)建對象,這在單利模式中經(jīng)常使用。
__desctruct()
析構(gòu)函數(shù)通常在對象被銷毀時調(diào)用,析構(gòu)函數(shù)不接收任何參數(shù)。經(jīng)常在析構(gòu)函數(shù)中執(zhí)行一些清理工作,比如關(guān)閉數(shù)據(jù)庫連接等。
屬性重載(Property Overloading)
有一點需要注意的是:PHP中的”重載”與其他大多數(shù)語言的重載不是太一樣,雖然都實現(xiàn)了相同的功能。
屬性重載涉及到的兩個魔術(shù)方法主要是用來處理屬性訪問,定義了當我們嘗試訪問一個不存在(或不可訪問)的屬性時會發(fā)生什么。
__get()
魔術(shù)方法__get()在我們嘗試訪問一個不存在的屬性時會被調(diào)用。它接收一個參數(shù),該參數(shù)表示訪問屬性的名字,并且將該屬性的值返回。在上面的Device類里,有一個data屬性,該屬性就在這里就起了作用,如下面得代碼:
新聞熱點
疑難解答
圖片精選