2

最近我看到很多关于 PHP 在 5.3 之前缺乏后期静态绑定的讨论。

从我读过的内容来看,在该语言具有此功能之前,ActiveRecord 之类的东西的正确实现是不可能的。

所以,我很好奇:

  • 哪些语言支持它,特别是那些通常与 Web 开发相关的语言,例如 Python、Ruby、Perl、Java、C#(JavaScript?)。
  • 哪个实际上定期使用它?
4

4 回答 4

4

如果你想解决这个问题,虽然这确实有点费时,但是当 php 5.3 可用并成为主流时很容易被删除,你可以试试下面的代码。

class Specific_Model extends Model{

    public static function GetAll($options = null){

        parent::GetAll($options, get_class());

    }

}


class Model{

    public static function GetAll($options = null, $class = null){

       if(is_null($class)) $class = get_class();  

       /* Do stuff here */

    }

}

然后你可以使用下面的代码...

Specific_Model::GetAll($options);

并在迁移到 php 5.3 时轻松去除多余的代码。

于 2008-12-15T05:43:16.250 回答
0

“后期静态绑定”的概念是对 PHP 静态声明类这一事实的修补。大多数动态语言都有一个对象系统,其中一个类就是一个对象。另一方面,PHP 将代码和运行时完全分开(如 C/C++)。这有各种奇怪的含义,如果没有我们会更好。

于 2008-12-16T12:54:02.120 回答
-1

如果没有后期静态绑定,当程序员清楚地在 B 类上表达函数时,PHP 解释器会将函数 hello() 绑定到 A 类。缺少后期静态绑定会导致打印“hello”,而不是打印“bye”,尽管 hello () 在 B 类上被调用。

于 2009-04-18T05:28:40.257 回答
-3

我完全误解了后期静态绑定是什么。这是维基百科所说的。

后期静态绑定是 [name] 绑定的变体,介于静态和动态绑定之间。考虑以下 PHP 示例:

class A {
    static $word = "hello";
    static function hello() {print self::$word;}
}

class B extends A {
    static $word = "bye";
}

B::hello();

如果没有后期静态绑定,PHP 解释器hello() 会在程序员清楚地在 class B. 没有后期静态绑定会导致打印“hello”,而不是“bye”,尽管hello() 被调用class B

解释器中的后期静态绑定意味着 $word在运行时确定。在这种情况下,它将引用B::$word ifB::hello()被调用和A::$word ifA::hello()被调用。这确实需要将关键字从 selfto更改为static(可能从 PHP 5.3 开始可用)A::hello()

class A {
    static $word = "Welcome";
    static function hello() {print static::$word;}
}

class B extends A {
    static $word = "bye";
}

B::hello();
于 2008-12-15T03:31:49.403 回答