由子类中的构造函数调用的php重写方法

php overriding method called by constructor in child class

我和几个班级一起玩,以了解父母和孩子之间的关系。我将父级设置为具有调用init方法的构造函数。然后,当我向子级添加init方法时,它应该重写父级init,不是吗?但现在发生的是两个方法都被调用了。

为了测试这个,我编写了一个名为model的类和一个名为instance的子类。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$try = new Instance;
echo $try;

class Model{

    public function __construct(){    
        $this->init();
    }

    public function init()
    {        
        return $this->className();  
    }

    public function __toString()
    {
        return $this->className();
    }

    public static function className()
    {
        return get_called_class();
    }

}

class Instance extends Model
{
    public function init()
    {
        echo"tada!";
     }
}

给出以下输出:

1
tada! Instance.

在类模型中,我使用magic方法uuToString()以字符串形式返回类名。父级的构造函数调用父级init()方法,在本例中,该方法将返回类名。

我的理解是,如果我编写一个子类,在这种情况下,该类被称为实例,使用in it()方法,它将覆盖父init()方法,但这不是正在发生的事情。在这种情况下,它返回in it mehtods,我不知道为什么。有人能解释一下吗?


事实是——

当使用"$Try=New Instance;"实例化类"Instance"的对象时。它调用构造函数,由于子类重写了"init"方法,所以它会打印"tada!".

在另一行,您使用"echo$try;"和在父类中实现的神奇方法u toString()来回送类"instance"的对象。所以它将"instance"打印为类名。

您只能运行$try=new instance;这将只打印"tada!".


您正在运行两个不同的命令。首先,您使用调用_uu构造的$try = new Instance;实例化类。父类中的construct()正在调用init(),init()使用子init()并返回tada!。在子类中创建一个空构造函数来重写父构造函数。

第二个命令是当您使用返回父类中定义的Instance的uuToString()来回送类:echo $try;

还可以使用以下方法添加到父构造函数:

1
2
3
4
5
public function __construct() {
  ...code...
  parent::__construct();
  ...code...
}


In this case, it returns both init mehtods

不,它没有;

"塔达!"正在被Instance::init()回音,"instance"正在被Model::__toString()回音。


原因:

由于您没有为子类定义任何构造函数,父类构造函数将被激发,这就是您获得该输出的原因。

说明:

当你这样做的时候

1
$try = new Instance;

父类构造函数被激发,它将调用执行get_called_class()className(),从而最终调用子类中的init(),得到输出"tada!"第一。

当你这样做的时候……

1
echo $try;

调用__toString()并返回类名Instance

所以,基本上,如果你的孩子班上有一个constructor,你就不会得到输出"tada!"