我正在寻找一种从子类自动神奇地调用父类构造函数(?)的方法:
(注意:这只是一个示例,因此可能存在输入错误)
Class myParent()
{
protected $html;
function __construct( $args )
{
$this->html = $this->set_html( $args );
}
protected function set_html( $args )
{
if ( $args['foo'] === 'bar' )
$args['foo'] = 'foobar';
return $args;
}
}
Class myChild extends myParent
{
public function do_stuff( $args )
{
return $this->html;
}
}
Class myInit
{
public function __construct( $args )
{
$this->get_stuff( $args );
}
public function get_stuff( $args )
{
$my_child = new myChild();
print_r( $my_child->do_stuff( $args ) );
}
}
$args = array( 'foo' => 'bar, 'what' => 'ever' );
new myInit( $args );
// Should Output:
/* Array( 'foo' => 'foobar', 'what' => 'ever' ) */
我想避免的是必须调用(在类myChild中)__construct( $args ) { parent::__construct( $args ); }
。
问题:这可能吗?如果是这样:怎么样?
谢谢!
答案 0 :(得分:9)
在您的示例代码中,myParent :: __构造将被称为wen instanciating myChild。 要让代码按照您的意愿工作,只需更改
即可public function get_stuff( $args )
{
$my_child = new myChild();
print_r( $my_child->do_stuff( $args ) );
}
通过
public function get_stuff( $args )
{
$my_child = new myChild($args);
print_r( $my_child->do_stuff() );
}
只要myChild没有构造函数,就会调用/继承父构造函数。
答案 1 :(得分:5)
由于Child
没有构造函数且扩展 Parent
,所以只要指定new Child()
,Parent
构造函数就会隐式致电。
如果确实指定了Child
构造函数,则必须在parent::__construct();
构造函数中使用指定Child
,因为它不会被隐式调用。
NB 在子类中定义构造函数时,最好在方法定义的第一行调用parent::__construct()
,以便在子类之前设置任何实例参数和继承的状态引发。