PHP V5.3 中的新特性,第 1 部分:對象接口的變化

PHP V5.3 計劃在 2008 年底發行,這個版本包含了大量在過去一直處於計劃階段的新特性。PHP V5.3 在最初被譽爲 “只缺少原生 Unicode 支持的 PHP V6”,現在它已經是 PHP V5 系列的全面升級。PHP V5.3 添加了新特性,並且對功能進行調試、修復與平臺有關的問題、刪除不會在未來的 PHP 版本中出現的舊特性,爲開發人員在未來使用 PHP V6 做好準備。在 “PHP V5.3 中的新特性” 系列文章中,我們將查看 V5.3 帶來的新特性,瞭解它們的使用以及如何將其應用到 Web 應用程序中。

PHP V5 和麪向對象編程

與 PHP V4 提供的特性相比,2004 年發佈的 PHP V5 在面向對象編程(OOP)和設計方面向前邁出了很大的一步。它提供了一些必要的改進,例如類可見性、合適的構造函數和解構函數、輸入提示和類反射(class-reflection)API。它爲在 PHP 中進行高級的面向對象編程敞開了大門,並允許實現更加簡單的設計模式,以及更好的設計類和 API。

PHP V5.3 在 OOP 方面提供了大量漸進式補充。這些改進一直集中在語法補充和性能改進方面。首先,我們將查看靜態方法和成員方面的新特性。





回頁首


改進靜態方法和成員處理

PHP V5 中的一個有用補充就是能夠將一個方法或類成員指定爲靜態的(PHP V4 確實支持對方法和類成員的靜態訪問,但是不能夠將方法或成員指定爲專門用於靜態訪問)。靜態訪問特別適合實現單一設計模式,在這種模式中只存在一個類實例。

PHP V5.3 提供一些特性來增強對類的靜態成員和方法的支持。我們將查看最近添加的一種魔術方法:__callStatic()

_callStatic() 魔術方法

PHP V5 提供了一些可用於類內部的特別定義的方法,稱爲魔術方法。當在類內部定義時,這些方法可以提供特殊的功能,並支持重載(允許一種方法接受不同類型的參數)和多態(允許不同數據類型使用相同的接口)。它們還允許通過 PHP 輕鬆地使用不同類型的 OOP 編程方法和設計模式。

在 PHP V5.3 中,添加了一種新的魔術方法:__callStatic()。它的工作方式類似於 __call() 魔術方法,後者的設計意圖是處理那些沒有在類中定義或對類不可見的方法的調用。然而,__callStatic() 是爲了處理靜態方法調用,這使我們能夠更好地設計方法重載。下面給出了一個使用該方法的示例。


清單 1. 使用 __callStatic()__call() 的示例
				 
class Foo
{
public static function __callStatic(
$name,
$args
)
{
echo "Called method $name statically";
}

public function __call(
$name,
$args
)
{
echo "Called method $name";
}
}

Foo::dog(); // outputs "Called method dog statically"
$foo = new Foo;
$foo->dog(); // outputs "Called method dog"

需要注意,PHP 確實加強了對 __callStatic() 方法的定義;它必須是公共的,並且必須被聲明爲靜態的。同樣,__call() 魔術方法必須被定義爲公共的,所有其他魔術方法都必須如此。





回頁首


動態的靜態調用

PHP 的一個優秀特性是可變變量。這表示可以使用某個變量的字符串值指定另一個變量的名稱。換句話說,可以執行與下面類似的操作。


清單 2. 可變變量
				
x = 'y';
$$x = 'z';
echo $x; // outputs 'y'
echo $$x; //
outputs 'z'

這也適用於函數,甚至是類方法,如下所示。


清單 3. 可變函數和類方法名
				 
class Dog
{
public function bark()
{
echo "Woof!";
}
}

$class = 'Dog'
$action = 'bark';
$x = new $class(); // instantiates the class 'Dog'
$x->$action(); // outputs "Woof!"

PHP V5.3 的一個新特性就是在進行靜態調用時,能夠使指定的類名成爲一個變量。這提供了一些新的機會,如下所示。


清單 4. 可變的類命名
				 
class Dog
{
public static function bark()
{
echo "Woof!";
}
}

$class = 'Dog';
$action = 'bark';
$class::$action(); //outputs "Woof!"

這一補充完善了 PHP 的可變變量特性,允許將它們應用到涉及 PHP 的所有情形。

讓我們查看一個有關靜態方法和成員應用的更有用的增強:延遲靜態綁定(late static binding)。





回頁首


延遲靜態綁定

在 V5.3 以前,PHP 存在的麻煩問題是如何處理靜態方法和成員。到目前爲止,使用自身或 __CLASS__ 進行的靜態引用都是在定義函數的類作用域中解析的。問題在於,如果類進行了擴展並且調用來自新的子類,那麼解析將是錯誤的。PHP V5.3 添加了延遲靜態綁定來解決這個問題。爲了更好地進行解釋,我們在下面將創建一個具有靜態方法的類。


清單 5. 使用靜態方法 test()Foo
				 
class Foo
{
protected static $name = 'Foo';

public static function test()
{
return self::$name;
}
}

讓我們對這個類進行擴展。我們將在子類中重新定義成員 $name


清單 6. 子類 Bar 擴展了父類 Foo
				 
class Bar
{
protected static $name = 'Bar';
}

我們在清單 7 中進行了靜態調用。


清單 7. 靜態方法調用 test()



本文轉自IBM Developerworks中國

      請點擊此處查看全文

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章