Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让PHP父函数引用子函数中的重写函数(如果存在)?_Php_Oop_Inheritance_Extends - Fatal编程技术网

如何让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的标记标记为他在答案部分的标记。但愿我知道谷歌“静态”!