为什么$this在php中不代表对象示例?

uqzxnwby  于 2023-11-16  发布在  PHP
关注(0)|答案(3)|浏览(105)

此问题在此处已有答案

Strange behavior when overriding private methods(3个答案)
Is it possible to overwrite a function in PHP(10个答案)
Is a private parent method "overridden" if child has an implementation of it?(1个答案)
Why can child override and access its parent private method?(1个答案)
2天前关闭。
这个例子的结果是“A类!“,而不是“B类!“,为什么?

class A {
    private function foo() {
        echo "Class A ! \n";
    }
    public function test() {
        var_dump($this);
        $this->foo();
    }
}
class B extends A {
    public function foo() {
        echo "Class B ! \n";
    }
}
$b = new B();
$b->test();
// Outputs: 
// object(B)#1 (0) {}
// Class A !

字符串
我还以为成绩是“B级!“

ryevplcw

ryevplcw1#

原因是因为类AA中的test()函数调用了$this->foo(),这意味着它是类中的函数(AAAA->foo()本身是一个私有函数。另外$this是PHP中引用当前对象的特殊变量。当类继承时,请参阅类BBCCfoo()访问修饰符是public,但是AA->foo()private。为了覆盖一个函数,你需要有相同的访问修饰符。由于访问修饰符是不一样的,即使名称相似,AA->foo()也不能被覆盖。

nuypyhwy

nuypyhwy2#

因为foo()在类A中是private,所以在类A之外不可见。因此类B中的foo()被视为不同的函数。B中的foo()不会覆盖A中的foo()。由于test()是A的一部分,它使用A中同名的函数。

class A {
   public function foo() {
      echo "Class A ! \n";
   }
   public function test() {
      var_dump($this);
      $this->foo();
   }
}

字符串
如果你把这两个函数都公开,你会得到你所期望的行为- demo:https://3v4l.org/8kOCl

0md85ypi

0md85ypi3#

不能在子类中修改私有类
把代码改成这样就可以了:

class A {
   public function foo() {
      echo "Class A ! \n";
   }
   public function test() {
      var_dump($this);
      $this->foo();
   }
}
class B extends A {
   public function foo() {
      echo "Class B ! \n";
   }
}

$b = new B();
$b->test();

字符串

相关问题