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构造的
第二个命令是当您使用返回父类中定义的
还可以使用以下方法添加到父构造函数:
1 2 3 4 5 | public function __construct() { ...code... parent::__construct(); ...code... } |
In this case, it returns both init mehtods
不,它没有;
"塔达!"正在被
原因:
由于您没有为子类定义任何构造函数,父类构造函数将被激发,这就是您获得该输出的原因。
说明:当你这样做的时候
1 | $try = new Instance; |
父类构造函数被激发,它将调用执行
当你这样做的时候……
1 | echo $try; |
调用
所以,基本上,如果你的孩子班上有一个