如何在PHP5.2中父类中的方法中使用的子类中创建常量?
编辑:如何在PHP5.2中父类中的方法中使用的子类中创建常量?,php,inheritance,constants,Php,Inheritance,Constants,编辑: *注意:不幸的是,我目前正在使用PHP5.2。我找不到一个像样的廉价主机提供5.3 在PHP中,self指定义被调用方法的类。这意味着,如果不重写子类中的方法,即使从子类调用,关键字self也将引用父类 例如,此代码: <?php class ParentClass { const NAME = "ParentClass"; public function showName() { echo self::NAME . "<br />\n"; }
*注意:不幸的是,我目前正在使用PHP5.2。我找不到一个像样的廉价主机提供5.3
在PHP中,
self
指定义被调用方法的类。这意味着,如果不重写子类中的方法,即使从子类调用,关键字self
也将引用父类
例如,此代码:
<?php
class ParentClass {
const NAME = "ParentClass";
public function showName() {
echo self::NAME . "<br />\n";
}
}
class ChildClass extends ParentClass {
const NAME = "ChildClass";
public function __construct() {
echo self::NAME . "<br />\n";
}
}
$test = new ChildClass();
$test->showName();
?>
我想做的是创建一个默认方法(例如上面示例中的showName()
),该方法存在于父类中,其常量定义了要使用的默认值。在child中,我希望能够重写这些常量(注意上面的child定义中的const
),并在对child实例调用该方法时使用这些值
简而言之,我怎样才能使上面的样本的输出
ChildClass
ChildClass
…而不必在子系统中复制父系统的代码?尝试
function showName() {
return static::NAME;
}
它使用:
从PHP5.3.0开始,PHP实现了
称为后期静态绑定的功能
可用于参考
在静态上下文中调用类
继承权
更准确地说,是后期静态绑定
通过将名为的类存储在
最后一个“非转发呼叫”。万一
静态方法调用,这是类
显式命名(通常是
操作符的左侧);万一
在非静态方法调用中,它是
对象的类。“转发”
“呼叫”是一个静态的
自我介绍:,家长:,
静态::,或者,如果在类中上升
层次结构,转发\静态\调用()。这个
函数get_调用的_class()可以是
用于检索具有
被调用类和静态类的名称::
介绍了它的范围
编辑:对于5.2.x
如果你没有5.3.0,你将无法利用这一点。一种常见的黑客解决方案是创建一个由子类名引用的静态缓存(例如,
private static$statics=array()
)。它要求您跟踪对象继承以覆盖_构造上的值,并明确定义哪些静态是“可继承的”。例如,在Sapphire ORM中使用此技术可以绕过PHP静态绑定限制。它们定义了一个、多个和各种静态var管理功能。我认为适合您的情况的语法是:
print constant(get_class($this)."::NAME");
也许这只是因为你的简短示例,但“自我”引用似乎并不需要 我会这样做:
class ParentClass {
public function showName() {
echo $this->name() . "<br />\n";
}
public static function name() {
return "ParentClass";
}
}
class ChildClass extends ParentClass {
public function __construct() {
echo $this->name() . "<br />\n";
}
public static function name() {
return "ChildClass";
}
}
$test = new ChildClass();
$test->showName();
使用
static::CONSTNAME
将返回正确的值。我应该更清楚一些,我目前仅限于PHP 5.2。5.3在共享主机上还没有很好的可用性。为什么这个常量可以工作,而它的名字在static
heritation的上下文中表明了这一点?太棒了!好吧,至少没那么可怕。谢谢对于寻求php5.3及以上解决方案的用户,您可以使用static::
关键字而不是self::
。我使用ServerGrove,他们以合理的价格提供5.3托管服务。@CaseySoftware:书签,谢谢。我将不得不查看一些评论等,但它看起来很有希望。我一直计划使用WebPosition,但价格差异看起来不大。WF确实执行5.3,但他们通过在您的帐户下运行另一个Apache、使用RAM等方式来执行—这不一定是我想要的。
class ParentClass {
public function showName() {
echo $this->name() . "<br />\n";
}
public static function name() {
return "ParentClass";
}
}
class ChildClass extends ParentClass {
public function __construct() {
echo $this->name() . "<br />\n";
}
public static function name() {
return "ChildClass";
}
}
$test = new ChildClass();
$test->showName();
ChildClass
ChildClass