每當(dāng)你看到一個方法名以雙下劃線開頭,它是一個“魔法"方法。PHP保留所有以 __
開頭的方法。
構(gòu)造函數(shù)是一種特殊的方法當(dāng)你創(chuàng)建一個實例時由PHP調(diào)用類。
PHP類構(gòu)造函數(shù)具有以下語法。
public function __construct(Optional Parameter) {}
<?PHP class MyClass { function __construct() { echo "I am being constructed."; } } $obj = new MyClass; ?>
上面的代碼生成以下結(jié)果。
類MyClass包含一個非常簡單的構(gòu)造函數(shù),只顯示消息。 當(dāng)代碼然后從該類創(chuàng)建一個對象,調(diào)用構(gòu)造函數(shù)并顯示消息。
你可以傳遞參數(shù)到構(gòu)造函數(shù),像正常的方法。
<?PHP class Person { private $_firstName; private $_lastName; private $_age; public function __construct( $firstName, $lastName, $age ) { $this-> _firstName = $firstName; $this-> _lastName = $lastName; $this-> _age = $age; } } $p = new Person( "James", "Bond", 28 ); ?>
Person類包含三個私有屬性和接受三個值的構(gòu)造函數(shù),將三個屬性設(shè)置為這些值。
如果一個類包含一個構(gòu)造函數(shù),它只有在從該類創(chuàng)建對象時才被調(diào)用。
如果從子類創(chuàng)建對象,則只調(diào)用子類的構(gòu)造函數(shù)。
要使子類調(diào)用其父構(gòu)造函數(shù),調(diào)用parent :: __ construct()。
<?PHP class NameTag { public $Words; } class Book { public $Name; public function say() { print "Woof!\n"; } public function __construct($BookName) { print "Creating a Book: $BookName\n"; $this->Name = $BookName; } } class ComputerBook extends Book { public function say() { print "Computer!\n"; } public function __construct($BookName) { parent::__construct($BookName); print "Creating a computer book\n"; } } ?>
最好先調(diào)用 parent :: __ construct()
一個子類的構(gòu)造函數(shù),以便設(shè)置所有父類的屬性。
析構(gòu)函數(shù)用于在對象從內(nèi)存中刪除之前對其進(jìn)行整理。
除了使用構(gòu)造函數(shù)外,您可以使用與構(gòu)造函數(shù)相同的方式創(chuàng)建析構(gòu)函數(shù)方法__destruct()而不是__construct():
function __destruct() { // (Clean up here) }
刪除對象時調(diào)用PHP析構(gòu)函數(shù)。析構(gòu)函數(shù)方法 __ destruct()
不帶參數(shù)。
<?PHP class Book { public $Name; public function say() { print "Woof!\n"; } public function __construct($BookName) { print "Creating a Book: $BookName\n"; $this->Name = $BookName; } public function __destruct() { print "{$this->Name} is destructing\n"; } } $aBook = new Book("PHP"); ?>
上面的代碼生成以下結(jié)果。
關(guān)鍵的區(qū)別是,你應(yīng)該調(diào)用 parent :: __ destruct()
本地代碼的銷毀。 例如:
<?PHP public function __destruct() { print "{$this->Name} is no more...\n"; parent::__destruct(); } ?>
下面的代碼顯示了如何create構(gòu)造函數(shù)和析構(gòu)函數(shù)。
<?php class Counter { private static $count = 0; function __construct() { self::$count++; } function __destruct() { self::$count--; } function getCount() { return self::$count; } } //create one instance $c = new Counter(); //print 1 print($c->getCount() . "<br>\n"); //create a second instance $c2 = new Counter(); //print 2 print($c->getCount() . "<br>\n"); //destroy one instance $c2 = NULL; //print 1 print($c->getCount() . "<br>\n"); ?>
上面的代碼生成以下結(jié)果。
在對象上調(diào)用 unset()
會調(diào)用它的析構(gòu)函數(shù)在刪除對象之前。
PHP允許你創(chuàng)建三個“魔術(shù)"方法,你可以使用攔截屬性和方法訪問:
可見是指不存在的屬性或方法或私人或保護(hù)財產(chǎn)或方法。
__get()指定什么當(dāng)加載未知屬性時。
例如:
<?PHP class Book { public $Name; public function __get($var) { print "Attempted to retrieve $var and failed...\n"; } } $aBook = new Book; print $aBook->Price; ?>
Overloading Property Accesses with __get()
<?PHP class Car { public function __get( $propertyName ) { echo "The value of "$propertyName" was requested < br / > "; return "blue"; } } $car = new Car; $x = $car->color; echo "The car"s color is $x \n"; ?>
上面的代碼生成以下結(jié)果。
使用__set()方法來捕獲將不可見屬性設(shè)置為值的嘗試,請使用需要兩個參數(shù):屬性名和要設(shè)置它的值。
它不需要返回值:
public function __set( $propertyName, $propertyValue ) { // (do whatever needs to be done to set the property value) }
設(shè)置時調(diào)用__set()魔術(shù)方法未定義屬性。
<?PHP class Book { public function __set($var, $val) { print("UPDATE $var = "$val";"); } } $book = new Book(); $book ->Price= 1.2; ?>
上面的代碼生成以下結(jié)果。
使用__call()來處理對類的不存在的方法的調(diào)用。該方法應(yīng)該返回一個值(如果有)回調(diào)用代碼:
public function __call( $methodName, $arguments ) { // (do stuff here) return $returnVal; }
當(dāng)調(diào)用缺少的方法時,調(diào)用__call()魔術(shù)方法。這里是一個__call()的例子:
<?PHP class Book { public function __call($function, $args) { $args = implode(", ", $args); print "Call to $function() with args "$args" failed!\n"; } } $aBook = new Book; $aBook->nonExistingMethod("foo", "bar", "baz"); ?>
上面的代碼生成以下結(jié)果。
__toString()允許您為對象設(shè)置字符串值。
<?PHP class Cat { public function __toString() { return "This is a cat\n"; } } $c = new Cat; print $c; ?>
上面的代碼生成以下結(jié)果。
下面的代碼顯示了如何創(chuàng)建__clone方法。
<?php class ObjectTracker { private static $nextSerial = 0; private $id; private $name; function __construct($name) { $this->name = $name; $this->id = ++self::$nextSerial; } function __clone() { $this->name = "Clone of $that->name"; $this->id = ++self::$nextSerial; } function getId() { return($this->id); } function getName() { return($this->name); } } $ot = new ObjectTracker("Zeev"s Object"); $ot2 = clone $ot; //1 Zeev"s Object print($ot->getId() . " " . $ot->getName() . "<br>"); //2 Clone of Zeev"s Object print($ot2->getId() . " " . $ot2->getName() . "<br>"); ?>
更多建議: