PHP继承,父函数使用子变量

Boj*_*vić 14 php oop inheritance

在查看一些PHP代码时,我发现了一件奇怪的事情.以下是它的简单示例说明:

文件A.php:

<?php
class A{
    public function methodA(){
        echo $this->B;
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

文件B.php:

<?php
    class B extends A{
        public $B = "It's working!";
    }
?>
Run Code Online (Sandbox Code Playgroud)

文件test.php:

<?php
    require_once("A.php");
    require_once("B.php");
    $b = new B();
    $b->methodA();
?>
Run Code Online (Sandbox Code Playgroud)

运行test.php打印出"它正在工作!",但问题是它为什么有效?:)这是一个功能还是一个bug?类A中的方法方法A也可以调用B类中不应该在OOP中工作的方法.

Bra*_*rad 12

你只是在实例化课程B.A暂时忽略,并假装这methodA()是课堂的一部分B.

当类B扩展时A,它会获得所有A的功能. $this->B在代码运行之前不进行评估,而不是之前.因此,不会发生错误,并且不会出现$this->B在类中B.

  • 只对公共成员变量有效. (3认同)

Muh*_*han 6

PHP是一种动态语言.方法和数据成员在运行时进行评估.当您调用方法或访问成员时,PHP实际上会查找排序的哈希表,以确定是否可以在此对象上访问此方法或成员,这可以是继承层次结构中的任何位置.

而且不仅仅是继承,你总是可以在运行时将任意数据分配给一个对象,并且类中的代码仍然可以使用$ this->某些东西来访问它,其中"某些东西"甚至不存在于类中.