gpt4 book ai didi

php - 从父类继承的函数中的 $this 仍然指向 php 中的父对象?

转载 作者:行者123 更新时间:2023-12-05 08:00:36 24 4
gpt4 key购买 nike

<?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应该指向子类的实例,但是事实上,它呼应了“ parent 的功能”。

当我将 pa 类中的函数 m() 更改为 public 时,它打印出“child's function”;但是为什么呢?位于类中的 $this 应该全部引用它创建的对象,无论函数在哪里(其中有“$this”)来自。可以用简单的方式向我解释吗?

编辑:

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

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

$this 在子类中引用了什么?

最佳答案

$this 总是引用实例,不属于父类(super class)或子类,这个实例同时具有 m 函数的私有(private)和公共(public)副本,如我的第一个 block 所示

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

但是什么因素会真正决定执行哪个 m() 函数?这取决于调用函数的位置,因为在我的第一个代码块中,m() 在父类(super class)中被调用,这意味着它具有优先级m() 在父类(super class)中被调用,所以结果将是 pa 的函数,在第二个代码块中,因为在继承类中 m() 函数被覆盖所以实例中只有 m() 函数,这意味着它将始终调用子类中的 m() 函数。

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

<?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()函数,与private或public无关

关于php - 从父类继承的函数中的 $this 仍然指向 php 中的父对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18010637/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com