最近我看到很多关于 PHP 在 5.3 之前缺乏后期静态绑定的讨论。
从我读过的内容来看,在该语言具有此功能之前,ActiveRecord 之类的东西的正确实现是不可能的。
所以,我很好奇:
- 哪些语言支持它,特别是那些通常与 Web 开发相关的语言,例如 Python、Ruby、Perl、Java、C#(JavaScript?)。
- 哪个实际上定期使用它?
如果你想解决这个问题,虽然这确实有点费时,但是当 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 时轻松去除多余的代码。
“后期静态绑定”的概念是对 PHP 静态声明类这一事实的修补。大多数动态语言都有一个对象系统,其中一个类就是一个对象。另一方面,PHP 将代码和运行时完全分开(如 C/C++)。这有各种奇怪的含义,如果没有我们会更好。
如果没有后期静态绑定,当程序员清楚地在 B 类上表达函数时,PHP 解释器会将函数 hello() 绑定到 A 类。缺少后期静态绑定会导致打印“hello”,而不是打印“bye”,尽管 hello () 在 B 类上被调用。
我完全误解了后期静态绑定是什么。这是维基百科所说的。
后期静态绑定是 [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()
被调用。这确实需要将关键字从self
to更改为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();