子类中构造函数调用的php重写方法
我和几个班一起玩,了解父母和孩子之间的关系。我将父级设置为具有调用init方法的构造函数。然后,当我向子对象添加init方法时,它应该覆盖父对象init,不是吗?但是现在发生的是两种方法都被调用了 为了测试这一点,我编写了一个名为Model的类和一个名为Instance的子类。代码如下:子类中构造函数调用的php重写方法,php,methods,constructor,overriding,Php,Methods,Constructor,Overriding,我和几个班一起玩,了解父母和孩子之间的关系。我将父级设置为具有调用init方法的构造函数。然后,当我向子对象添加init方法时,它应该覆盖父对象init,不是吗?但是现在发生的是两种方法都被调用了 为了测试这一点,我编写了一个名为Model的类和一个名为Instance的子类。代码如下: $try = new Instance; echo $try; class Model{ public function __construct(){ $this->i
$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.
在类模型中,我使用神奇的方法\uuuToString()将类名作为字符串返回。父级的构造函数调用父级init()方法,在本例中,该方法回显类名
我的理解是,如果我编写一个子类,在这种情况下,该类被称为Instance,使用init()方法,它将覆盖父init()方法,但实际情况并非如此。在本例中,它同时返回init方法,我不知道为什么。有人能解释一下吗?原因:
由于您没有为子类定义任何构造函数,因此父类构造函数将被激发,这就是您获得该输出的原因
说明:
当你这样做的时候
$try = new Instance;
父类构造函数被激发,它将调用init()
,后者反过来调用className()
,该类执行get\u called\u class()
,因此最终将调用子类中的init()
,并首先得到输出“tada!”
当你这么做的时候
echo $try;
调用\uuu toString()
,并返回类名实例
因此,基本上,如果您的子类上有一个
构造函数
,您将不会得到输出“tada!”您正在运行两个不同的命令。首先,用$try=newinstance实例化类代码>正在调用_构造。父类中的_构造()正在调用init(),它使用子init()并返回tada代码>。在子类中创建空白构造函数以重写父构造函数
第二个命令是在回显类时:echo$try
使用u_toString()进行调用,该函数将响应父类中定义的实例
您还可以使用以下命令添加到父构造函数:
public function __construct() {
...code...
parent::__construct();
...code...
}
在本例中,它返回两个init方法
不,它没有
“塔达!”正在被Instance::init()
回送,而“Instance”正在被Model::\uu-toString()
回送。事实是-
当您使用“$try=new Instance;”实例化类“Instance”的对象时。它调用构造函数,因为子类重写“init”方法,所以它打印“tada!”
在另一行,您使用“echo$try;”和在父类中实现的神奇方法\uu toString()回送类“实例”的对象。所以它打印“实例”作为类名
只能运行$try=new实例只打印“tada!”。承包商
?你的意思是构造函数:)也谢谢你的回答,它帮助我理解了它是如何工作的。谢谢你的回答和建议,它帮助我理解了它是如何工作的。所以,为了100%的清晰,在定义magic _toString()方法时,如果对象本身被回响,那么该方法中定义的任何内容都将被打印出来,就像我使用echo$try;谢谢大家的帮助。