如何让PHP父函数引用子函数中的重写函数(如果存在)?
给定以下代码:如何让PHP父函数引用子函数中的重写函数(如果存在)?,php,oop,inheritance,extends,Php,Oop,Inheritance,Extends,给定以下代码: class A { public static function one() { return "results from Parent::one"; } public function two() { return "Parent::two got info: ".self::one(); } } class B extends A { public static
class A {
public static function one() {
return "results from Parent::one";
}
public function two() {
return "Parent::two got info: ".self::one();
}
}
class B extends A {
public static function one() {
return "results from child::one";
}
}
$a=new B();
print "calling two I get: ". $a->two()."\n";
print "calling one I get: ". $a->one()."\n\n";
我得到以下结果:
调用两个我得到:父::二得到信息:来自父::一的结果
调用我得到的一个:来自child::one的结果
我期望上述第一个结果是:
调用两个I get:Parent::two get info:results from child::one
看起来,虽然重写可以工作,但它们不会递归地工作,只在来自子对象的直接调用中工作。有没有办法确保当一个子类从父类访问一个方法时,父类方法在被重写的方法存在时引用它们
谢谢您可能正在寻找后期绑定。只需从
self::one()
更改为static::one()
就可以了
return "Parent::two got info: ".static::one();
您可能正在寻找后期绑定。只需从
self::one()
更改为static::one()
就可以了
return "Parent::two got info: ".static::one();
$this->one()
而不是self::one()
这是一个静态方法,因此您应该使用static::one()
来执行。不要使用$this
调用静态方法。@AlexBarker如果你要做出一个明确的声明,比如“不要使用$this
调用静态方法”,你应该给出一些理由。在这个例子中,two()
不是一个静态函数,所以在这个函数中我们知道一个实例化的对象已经被使用,因此,我认为在这里使用$this
没有任何内在的错误。@PatrickQ,我不认为它需要解释,因为它违反了语言结构。事实上,这种方法不是静态的,我的错误。多亏了你们,我需要两种解决方案,因为我在一些静态函数中遇到了同样的问题。我不能将此标记为答案,因为它在评论中,而不是答案。不知道你是否在乎,但如果你们中有人想要学分,把它放在答案部分,我会标记它。。。否则我会把forsvunnet的标记标记为他在答案部分的标记。但愿我知道谷歌“静态”$this->one()
而不是self::one()
这是一个静态方法,因此您应该使用static::one()
来处理。不要使用$this
调用静态方法。@AlexBarker如果你要做出一个明确的声明,比如“不要使用$this
调用静态方法”,你应该给出一些理由。在这个例子中,two()
不是一个静态函数,所以在这个函数中我们知道一个实例化的对象已经被使用,因此,我认为在这里使用$this
没有任何内在的错误。@PatrickQ,我不认为它需要解释,因为它违反了语言结构。事实上,这种方法不是静态的,我的错误。多亏了你们,我需要两种解决方案,因为我在一些静态函数中遇到了同样的问题。我不能将此标记为答案,因为它在评论中,而不是答案。不知道你是否在乎,但如果你们中有人想要学分,把它放在答案部分,我会标记它。。。否则我会把forsvunnet的标记标记为他在答案部分的标记。但愿我知道谷歌“静态”!