我需要能够在从基类扩展基类的类中使用静态变量集。
考虑一下:
class Animal {
public static $color = 'black';
public static function get_color()
{
return self::$color;
}
}
class Dog extends Animal {
public static $color = 'brown';
}
echo Animal::get_color(); // prints 'black'
echo Dog::get_color(); // also prints 'black'
这在 PHP 5.3.x 中非常有效(Dog::get_color()
打印 'brown'),因为它具有后期静态绑定(bind)。但是我的生产服务器运行 PHP 5.2.11,所以我需要调整我的脚本。
是否有解决此问题的一些不错的解决方法?
干杯!
克里斯托夫
编辑:目标
如下所述,这是一个非常简化的示例,说明了我要完成的任务。如果我向您提供我用来解决我的问题(以及问题本身)的两个选项,那么其他人可能会有与我不同的解决方案...
我已经构建了一个基础数据库模型,其中包含“find”、“find_by”和“find_all”(都是静态的)等函数。
在 PHP 5.3 中有一个名为 get_called_class()
的函数,我目前使用它来确定被调用类的名称,然后使用它映射到正确的数据库表。前类 User
将指向 users
。
get_called_class()
在 PHP 5.2.x 中不存在,我发现的 hack 实现非常不可靠。然后我转向在所有包含类名的模型类中使用静态变量的选项。
最佳答案
我在 Zend Framework 中对某些东西进行子类化时遇到了这个问题。我的决定是,在纯静态领域,你只有一个选择......在继承类中重新定义函数:
class Animal {
public static $color = 'black';
public static function get_color()
{
return self::$color;
}
}
class Dog extends Animal {
public static $color = 'brown';
public static function get_color()
{
return self::$color;
}
}
如果您能够创建实例 - 您可以使用 get_class($this)
找出调用类,例如:
class Animal {
public static $color = 'black';
public function getColor() // note, not static
{
$class = get_class($this);
return $class::$color;
}
}
class Dog extends Animal {
public static $color = 'brown';
}
$animal = new Animal();
echo $animal->getColor(); // prints 'black'
$dog = new Dog();
echo $dog->getColor(); // prints 'brown'
我想到的唯一其他选择是使用静态函数的函数参数来定义从中调用它的类。它可以默认为 __CLASS__
,然后您可以从子类中返回 parent::get_class($class)
。像这样的模式可以用来更容易地重用静态函数(因为我怀疑返回公共(public)静态属性是您尝试在该静态方法中使用 self::
的唯一东西:
class Animal {
public static $color = 'black';
public static function get_color($class = __CLASS__)
{
// Super Simple Example Case... I imagine this function to be more complicated
return $class::$color;
}
}
class Dog extends Animal {
public static $color = 'brown';
public static function get_color($class = __CLASS__)
{
return parent::get_color($class);
}
}
关于php - PHP 5.2 中的类继承 : Overriding static variable in extension class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3017777/