不知怎的,我的思绪远离当前的问题,我犯了一个可怕的错误.. 我在一个只初始化类属性的方法中调用了一个父构造函数。或者我做了..父构造函数的工作是设置ID值。 PHP允许我这样做。但这不是错的吗?看起来我可以用同样的方式调用类自己的构造函数。是不是只有在创建类的实例时才允许构造函数调用...而且它们只在创建实例时被调用..
<?php
class A {
public function __construct() {
echo "Test<br />";
}
}
class B extends A {
public function test() {
parent::__construct();
}
}
$b = new B();
$b->test();
// OUTPUT:
// Test
// Test
?>
编辑:所以结论是PHP允许你在方法中调用构造函数,但它实际上什么都不做。而其他“TEST”字符串来自基类的构造函数。
答案 0 :(得分:3)
一个词完全描述了这种情况。
替换强>
当父类具有__construct
之类的方法并且子类没有该方法时,当子类调用该方法时,它会调用parents方法。
例如:
class Parent
{
public function start(){}
}
class Child extends Parent
{
}
如果我在Child类上调用start方法,它会执行Parent::Start()
,但是如果Child类有一个名为Start()
的方法,则会将其称为重写父母版。
每个类都有一个构造函数方法,并且php执行它来将类编译成一个对象,现在如果你在一个类中有一个名为__construct()
的方法,PHP调用编译该类的内部构造,然后调用你的覆盖构造函数。
如果在Child类中没有__construct
方法,则PHP执行父__construct
这就是您在对象初始化中获得 2 x Test
的原因。
您应该使用parent:__cosntruct()
的唯一时间是,如果您的Child类需要用户定义的构造函数,则显式调用父构造以准备父对象。
例如:
class Parent
{
public function __construct()
{
//Do work on Parent Class
}
}
class Child extends Parent
{
public function __construct()
{
//Do Work on Child Class
parent::__construct();
}
}
你应该只在子构造函数中调用父构造函数而不是子方法的原因是构造函数应该只调用一次,这样就可以强制执行。
答案 1 :(得分:1)
您不会在任意时间调用父构造函数。您只能从子构造函数调用父构造函数,即在构造对象时。
如果 php 允许,那么这只是一个关于如何用语言实现类的人工制品,不应该被认为是一件好事。
答案 2 :(得分:0)
这不是一个好习惯,而且表现良好的OOP语言通常不会让你这样做。如果你确切知道自己在做什么,那就完全没问题了。 (并且您可以记录这一点,以便使用该代码的其他程序员理解您的概念。)
答案 3 :(得分:0)
我建议使用“init”方法来处理这种行为。这是一个例子:
class A {
public function __construct() {
$this->init();
}
protected function init() {
echo "Test<br />";
}
}
class B extends A {
public function __construct() {
// suppress parent constructor
}
public function test() {
$this->init();
}
}