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

时间:2014-04-09 03:43:30

标签: php methods constructor override

我正在玩几个课程,以了解父母和孩子之间的关系。我设置父级有一个调用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,我不知道为什么。谁能解释一下呢?

4 个答案:

答案 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()回应。