我正在玩几个课程,以了解父母和孩子之间的关系。我设置父级有一个调用init方法的构造函数。然后当我向孩子添加一个init方法时,它应该覆盖父init,不应该吗?但正在发生的是两种方法都被调用。
为了测试这个,我编写了一个名为Model的类和一个名为Instance的子类。这是代码:
$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! ";
}
}
提供以下输出:
tada! Instance.
在类Model中,我使用magic方法__toString()将类名作为字符串返回。父类的构造函数调用父init()方法,在这种情况下,它会回显类名。
我的理解是,如果我编写一个子类,在这种情况下,该类称为Instance,使用init()方法,它将覆盖父init()方法,但这不是正在发生的事情。在这种情况下,它返回两个init mehtods,我不知道为什么。谁能解释一下呢?
答案 0 :(得分:3)
事实是 -
当您实例化Class" Instance "的对象时使用" $ try = new Instance; "。它调用构造函数,因为子类覆盖" init"方法,打印" tada!"。
在另一行,你回应了Class" Instance "的对象。使用" echo $ try; "以及在父类中实现的神奇方法 __ toString()。所以它打印"实例"作为班级名称。
您只能运行 $ try = new Instance; ,只会打印" tada!"。
答案 1 :(得分:2)
您正在运行两个不同的命令。首先,您使用$try = new Instance;
实例化类,该类调用__construct。父类中的__construct()调用init(),它使用子init()并返回tada!
。在子类中创建一个空白构造函数以覆盖父构造函数。
第二个命令是当您使用__toString()回显类:echo $try;
时,它正在回显父类中定义的Instance
。
您还可以使用以下命令添加到父构造函数:
public function __construct() {
...code...
parent::__construct();
...code...
}
答案 2 :(得分:0)
由于您没有为子类定义任何构造函数,因此将触发父类构造函数,这就是您获得该输出的原因。
当你这样做时
$try = new Instance;
父类构造函数被触发,它将调用init()
,而className()
会调用执行get_called_class()
的{{1}},因此最终会在子类中调用init()
将被调用,你首先得到输出“tada!”。
当你这样做..
echo $try;
调用__toString()
并返回类名Instance
所以基本上,如果你的孩子班上有constructor
,你就不会得到输出“tada!”
答案 3 :(得分:0)
在这种情况下,它返回两个init mehtods
不,它没有;
'多田&#39!; Instance::init()
和'实例'正在回应正在被Model::__toString()
回应。