3
<?php
class pa{
    private function m(){
        echo 'Parent\'s function';
    }
    public function run(){
        $this->m();
    }
}
class child extends pa{
    public function m(){
        echo 'child\'s function';
    }
}
$obj=new child();
$obj->run();//results: parent's function,why?

代码 2

class pa{
    public function m(){//change private to public
        echo 'Parent\'s function';
    }
    public function run(){
        $this->m();
    }
}
class child extends pa{
    public function m(){
        echo 'child\'s function';
    }
}
$obj=new child();
$obj->run();//result:child function

编辑:子类扩展了pa,所以它有函数run()可供使用,run()函数实际上属于子类,子类中的这个run()函数中的$this应该指向子类的实例,但事实是,它呼应了“父母的职能”。

当我将 pa 类中的函数 m() 更改为 public 时,它打印出“子函数”;但是为什么?驻留在类中的 $this 都应该引用它创建的对象,无论函数在哪里(其中有“ $this") 来自。有谁能简单地向我解释一下吗?

编辑:

更具体地说,run() 函数中的 $this 在这两种情况下指向两个不同的对象。

而在等了很久的答案之后,似乎没有人能明确解释为什么在这两种情况下,$this 指的是两种不同的东西。

$this 在子类中指的是什么?

4

1 回答 1

0

$this 始终引用实例,不属于超类或子类,此实例具有 m 函数的私有和公共副本,如我的第一个块所示

    private function m(){
        echo 'Parent\'s function';
    }
    public function m(){
        echo 'Parent\'s function';
    }

但是实际上是什么因素决定了哪个 m() 函数将被执行?这取决于函数被调用的位置,就像在我的第一个代码块中,m() 在超类中被调用,这意味着它对 m( ) 在要调用的超类中,因此结果将是 pa 的函数,而在第二个代码块中,由于在继承的类中 m() 函数被覆盖,因此实例中只有 m() 函数,这意味着它总是会调用子类中的 m() 函数。

上面的评论似乎要么错过了我要问的重点,要么没有完全理解类和实例之间差异的基本知识,初学者总是对这些概念感到困惑,我在这里澄清差异,还有一个规则值得注意,因为 $this 将首先找到使用 $this 的地方声明的函数,然后寻找继承的类。所以,如果在第一个代码块中,将函数 run() 移动到子类为:

<?php
class pa{
    private function m(){
        echo 'Parent\'s function';
    }
}
class child extends pa{
    public function m(){
        echo 'child\'s function';
    }
    public function run(){
        $this->m();
    }
}
$obj=new child();
$obj->run();//results: child function

结果很清楚,子类的实例也包含两个 m() 函数,但由于 m() 在子范围内调用,它将使用子 m() 函数,与私有或公共无关

于 2013-08-04T02:40:26.187 回答