Can't override parent construct

Can't override parent construct

I'm trying to override parent construct class in child class by following way but it's not success !

Parent class:

class Base extends \Core\Model
 {
      /**
     * Error messages
     *
     * @var array
     */
    public $errors = [];
    public $errorMsg = '';

    /**
     * Class constructor
     *
     * @param array $data initial property values
     *
     * @return void
     */    
     public function __construct($data = [])
    {
        foreach ($data as $key => $value) {
            $this->$key = $value;
        };
    }
}

Child class :

class Visit extends Base
 {
      /**
     * Error messages
     *
     * @var array
     */
    public $subscribe;

    /**
     * Class constructor
     *
     * @param array $data initial property values
     *
     * @return void
     */    
    public function __construct()
    {
        parent::__construct($data = []);
        $this->subscribe = new Subscribe();
    }
}

Please note above code it's not my full code ( too long ), I've just copy construct to avoid misunderstanding.

The data comes from a form in controller ($_POST), so when I run the above I got the following:

Message: 'Undefined property: App\Models\Visit::$phone'

Which mean parent construct didn't work after overriding !

Hope it's clear and thanks in advance.

Answer

The calling side tries to construct object from your class with array of arguments and suppose that they will become a public properties of this object as it is done in Base constructor.

If it is done like this $a=new Base(['phone'=>'123']) then $a->phone will be available.

But your constructor does not use any arguments, while it should forward them to parent.
Try this way:

public function __construct($data=[])
    {
        parent::__construct($data);
        $this->subscribe = new Subscribe();
    }

Enjoyed this question?

Check out more content on our blog or follow us on social media.

Browse more questions