Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中在父构造函数之前调用子方法_Php_Oop - Fatal编程技术网

PHP中在父构造函数之前调用子方法

PHP中在父构造函数之前调用子方法,php,oop,Php,Oop,可以在父构造函数之前调用子方法吗 我在子类中有定义变量的方法,然后传递给父类。父类接收变量后,它将应用于类中的各种属性 这是我的相关代码 父类 class CParent { private $arrMember = array(); private $mark; function CParent{ /* * If parent constructor run first, init() method'll get blank array. */

可以在父构造函数之前调用子方法吗

我在子类中有定义变量的方法,然后传递给父类。父类接收变量后,它将应用于类中的各种属性

这是我的相关代码

父类

class CParent
{
  private $arrMember = array();
  private $mark;

  function CParent{
    /*
     * If parent constructor run first, init() method'll get blank array.
     */
    $this->setAttr();
  }      

  protected function init(){ return array(); }

  private function setAttr(){

    $arr = $this->init();

    foreach ($arr as $item){
      array_push($this->arrMember, $item['name']);

      if (isset($item['mark']) && $item['mark'] == TRUE)
        $this->mark = $item['name'];
    }
  }

}
儿童班

class CChild extends CParent
{
  /*
   * I'd like to define variable within this method then pass to parent class.
   */
  protected function init(){
    return = array(
               array('name' => 'v1', 'mark' => true),
               array('name' => 'v2'),
               array('name' => 'v3')
             );
  }
}

您需要重写子构造函数中的父构造函数

public function __construct(){
    $this->setAttr();
}

如果不重写父构造函数,则在实例化子构造函数时将调用它。但是,如果重写它,则仅当您从子构造函数执行
parent::\u construct()
时才会调用它。

如果实例化子构造函数,子构造函数将首先执行。应该可以从那里向父构造函数传递一个值。看一看PHP的神奇方法——特别是
\uu construct()
——如果先运行父构造函数,您会很好,init()方法将得到空白数组。-不,不会,因为您在孩子中声明了
init()
class@MikeW-感谢它的工作,但我仍然想在方法中定义变量。@一个技巧小马-我尝试过,但它返回空数组,因为父类首先运行,此时方法init()仍然为空。@一个技巧小马-感谢您的建议,但仍然是相同的结果。