最近我看到很多关于PHP缺乏后期静态绑定的讨论,直到5.3。
据我所知,在语言具有此功能之前,无法正确实现ActiveRecord等内容。
所以,我很好奇:
答案 0 :(得分: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时,可以轻松删除多余的代码。
答案 1 :(得分:0)
“Late Static Binding”的概念是修补PHP静态声明类的事实。大多数动态语言都有一个对象系统,其中一个类是一个对象。另一方面,PHP保持代码和运行时完全分离(如C / C ++)。这有各种各样奇怪的含义,没有我们会更好。
答案 2 :(得分:-1)
没有后期静态绑定,当程序员在类B上清楚地表达函数时,PHP解释器将函数hello()绑定到类A.没有后期静态绑定会导致打印“hello”,而不是“再见” “尽管在B级调用了hello()。
答案 3 :(得分:-3)
我完全误解了后来的静态绑定是什么。这是Wikipedia所说的内容。
后期静态绑定是一种变体 [name]绑定静态和。之间的某处 动态绑定。考虑一下 以下PHP示例:
class A {
static $word = "hello";
static function hello() {print self::$word;}
}
class B extends A {
static $word = "bye";
}
B::hello();
没有后期静态绑定,PHP 解释器绑定函数
hello()
程序员的时候是A级 清楚地表达了这个功能class B
。没有迟到的静电 绑定会导致“你好” 打印,尽管hello()
不是“再见” 在class B
上被调用。后期静止 解释器中的绑定意味着
中$word
在运行时确定。在 这种情况下会引用B::$word
如果调用B::hello()
并A::$word
如果调用A::hello()
这样做 需要更改关键字self
到static
(可能可用 从{5.3}开始,在A::hello()
class A {
static $word = "Welcome";
static function hello() {print static::$word;}
}
class B extends A {
static $word = "bye";
}
B::hello();