【问题标题】:php overriding method called by constructor in child class子类中构造函数调用的php覆盖方法
【发布时间】:2014-05-22 01:16:58
【问题描述】:

我正在玩几个班级来了解父母和孩子之间的关系。我将父级设置为具有调用 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 中,我使用魔术方法 __toString() 将类名作为字符串返回。父类的构造函数调用父类的 init() 方法,在这种情况下与类名相呼应。

我的理解是,如果我编写一个子类,在这种情况下,该类称为 Instance,具有 init() 方法,它会覆盖父 init() 方法,但事实并非如此。在这种情况下,它返回两个初始化方法,我不知道为什么。谁能解释一下?

【问题讨论】:

    标签: php methods constructor overriding


    【解决方案1】:

    事实是——

    当您使用“$try = new Instance;”实例化类“Instance”的对象时。它调用构造函数,并且由于子类覆盖“init”方法,它打印“tada!”。

    另一方面,您使用“echo $try;”和魔术方法__toString()来回显类“Instance”的对象> 在父类中实现。所以它将“Instance”打印为类名。

    您只能运行 $try = new Instance;,它只会打印“tada!”。

    【讨论】:

    • contractor?你的意思是构造函数:)
    • 也感谢您的回答,它帮助我了解了它的工作原理。
    【解决方案2】:

    您正在运行两个不同的命令。首先,您使用调用 __construct 的 $try = new Instance; 实例化该类。父类中的 __construct() 正在调用使用子 init() 的 init() 并返回 tada!。在子类中创建一个空白构造函数来覆盖父构造函数。

    第二个命令是当您回显类时:echo $try; 使用 __toString() 回显父类中定义的 Instance

    您还可以使用以下方法添加到父构造函数:

    public function __construct() {
      ...code...
      parent::__construct();
      ...code...
    }
    

    【讨论】:

    • 感谢您的回答和建议,它帮助我了解了它的工作原理。
    【解决方案3】:

    原因:

    由于您没有为您的子类定义任何构造函数,父类构造函数将被触发,这就是您获得该输出的原因。

    解释:

    当你这样做时

    $try = new Instance;
    

    父类构造函数被触发,它将调用init(),后者又调用className(),后者执行get_called_class(),因此最终将调用子类中的init(),并获得输出“tada!”首先。

    当你这样做时..

    echo $try;
    

    调用__toString() 并返回类名Instance

    因此,基本上,如果您的子类中有 constructor,您将不会获得输出 "tada!"

    【讨论】:

      【解决方案4】:

      在这种情况下,它返回两个初始化方法

      不,它没有;

      'tada!' Instance::init() 正在回应,Model::__toString() 正在回应“实例”。

      【讨论】:

      • 所以,为了 100% 清晰,在定义魔法 _toString() 方法时,如果对象本身被回显,则该方法中定义的任何内容都将被打印出来,就像我对 echo $try 所做的那样;谢谢大家的帮助。
      猜你喜欢
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 2014-01-31
      • 2021-12-31
      • 1970-01-01
      相关资源
      最近更新 更多