2010-08-13 88 views
20

我是wonderinf如果你能帮助我..PHP - 扩展__construct

我有两个班,一个扩展等.. B级将通过各种不同的对象进行扩展,并用于公共数据库的交互..现在我想B类处理其连接和断开无方向从A类或任何外部输入..

从我所了解的问题是,扩展类将不会自动运行__construct函数..是否有解决这个问题的方法?

在此先感谢..

class a extends b 
{ 
    public function __construct() 
    { 
    } 

    public function validateStuff() 
    { 
     $this->insert_record(); 
    } 
} 

class b 
{ 
    public function __construct() 
    { 
     $this->connect(); 
    } 

    protected function connect() 
    { 
     return true; 
    } 

    public function insert_record() 
    { 
     return true; 
    } 
} 

回答

55

父如果实例子类B类中定义的方法__construct()会自动运行,除非在一个类中定义的方法__construct()

class a extends b { 
} 

class b { 
    public function __construct() 
    { 
     echo 'In B Constructor'; 
    } 
} 

$x = new a(); 

如果__construct()方法在类定义的,那么这将覆盖使用中类B的方法__construct()的....它将运行代替 B类__construct()方法

class a extends b { 
    public function __construct() 
    { 
     echo 'In A Constructor'; 
    } 
} 

class b { 
    public function __construct() 
    { 
     echo 'In B Constructor'; 
    } 
} 

$x = new a(); 

因此,如果您的子类中定义了__construct()方法,那么如果您想要执行该方法,则需要显式调用父类的构造函数。

class a extends b { 
    public function __construct() 
    { 
     parent::__construct(); 
     echo 'In A Constructor'; 
    } 
} 

class b { 
    public function __construct() 
    { 
     echo 'In B Constructor'; 
    } 
} 

$x = new a(); 
+3

谢谢:) - stackoverflow是非常好的有和找到相关的信息,你可以尽情享受这样的工作流程,“像,我知道这一点,但我只是想确保我没有碰到一个PHP的直觉怪僻的地方” - 谢谢哈哈! – lol 2013-05-07 13:43:42

10

我不知道我完全理解你的要求,但你可以叫家长从孩子的构造

parent::__construct(); 

这就是构建方法只有我知道的选项。

+0

我不想从类a调用所有的构造函数。我希望找到一个方法来应用b类的构造函数来自动运行。 – Lee 2010-08-13 13:43:52

3

呼叫parent::__construct()a::__construct()

class a extends b 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function validateStuff() 
    { 
     $this->insert_record(); 
    } 
} 

可以省略的构造完全,如果你没有做任何一个特定的东西。

+0

我不想从类a调用构造函数..我希望找到一个方法来应用b类的构造函数来自动运行.. – Lee 2010-08-13 13:43:34

+0

啊这是答案..通过将构造函数从类A ,B班跑了!谢谢! – Lee 2010-08-13 13:51:45