日期:2014-05-17  浏览次数:20433 次

PHP V5.3 中的新特性,第 1 部分: 对象接口的变化
http://www.ibm.com/developerworks/cn/opensource/os-php-5.3new1/
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()
  &nbs