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

子类中构造函数调用的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

我和几个班一起玩,了解父母和孩子之间的关系。我将父级设置为具有调用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.
在类模型中,我使用神奇的方法\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;谢谢大家的帮助。