php如何确保父类被构造

Posted

技术标签:

【中文标题】php如何确保父类被构造【英文标题】:php how to ensure that parent class gets constructed 【发布时间】:2011-01-24 15:15:48 【问题描述】:

确保始终构造父类的最佳方法是什么,因为我们可以轻松地覆盖构造函数而无需调用它们。

另外:这是不好的做法吗?

abstract class A

 // make it final to ensure parent constructor is allways used
 final function __construct($param1)
 
  // do essencial stuff here with $param1
  // pass construction with remaining args to child
  call_user_func_array(array($this,'init'),array_slice(func_get_args(),1));
 
 abstract function init();


class B extends A

 function init($param2)
 
  // effectively extends parent constructor, no?
 


$obj = new B("p1","p2");

【问题讨论】:

那行得通。你有什么保留? 为什么必须调用父构造函数,为什么它如此重要以至于你不能回复那些扩展你的类以正确调用你的构造函数的人?对我来说,这闻起来像是设计缺陷。请解释一下你实际上想要做什么。 @Sander:我有一组开发类,它们的构造函数需要太多参数并进行很多必要的初始化。客户端代码必须能够轻松扩展这些类,而无需覆盖它们的构造函数。如果他们(客户)也需要他们的子类在构造上做任何事情,他们只需将代码添加到 init 方法或将其留空。 @fabio:请参阅参数对象上的this article,以减少方法/构造函数的参数数量... @fabio:除了ircmaxell的建议,也可以看看dependency injection。这可能有助于减少构造函数中的初始化,甚至有助于使您的类更简单。 【参考方案1】:

您可以通过调用显式调用父级的构造函数:

parent::__construct(<params>);

据我所知,构造函数应该是public

【讨论】:

构造函数可以是公开的,但不是必须的。有很多使用非公共构造函数的用例(工厂方法,强制子类声明公共构造函数等)...... @ircmaxell:当您说“非公共”构造函数时,您是否还包括受保护的构造函数?这样的事情会有用例吗? @fabio:当然。任何你有一个私有构造函数但想提供扩展选项的地方。工厂方法和框架就是一个很好的例子。框架旨在扩展。他们不应该有任何私有方法。 另一个可以想象创建一个受保护的(甚至是私有的,如果你不需要继承)构造函数的例子是在实现单例模式时。

以上是关于php如何确保父类被构造的主要内容,如果未能解决你的问题,请参考以下文章

面向对象:继承抽象类抽象方法虚方法

php子类的构造函数能继承父类的吗?

PHP子类能否继承父类的构造方法?

JAVAjava 与 php 的构造方法执行机制异同

php子类是否自动调用父类构造函数

在php中,子类extends继承了父类,当子类和父类同时存在构造函数__construct先执行哪一个呢?