Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

php constructor inheritance

I want to clarify a problem i am having

I have a base DataBase class that will be inherited by a bunch of other classes.The constructor looks like this:

public function __construct ($table)
{
     $this->table = $table;
     $this->db = new Database();
     $this->db->connect();
}

I will call from this constructor from children as following:

 public function __construct ($something)
{
    parent::__construct("planets_games");
}

My problem is that php doesn't allow me to make the child's constructor without the $something parameter i get the following:

 Fatal error: Declaration of planetsGames::__construct() must be compatible with that of IScaffold::__construct()

I am currently bypassing this by instantiating an object like this:

$pg = new planetsGames('uselessStringHereThatHasNoUtilityAtAll');

I think i am missing something very important in my basic php knowledge

Thank you very much for the help in advance

like image 440
user1840302 Avatar asked Mar 17 '13 10:03

user1840302


Video Answer


2 Answers

A few years late to the party....

The problem is your constructor is needing a value. You can prevent the fatal error by setting a default value such as an empty string.

public function __construct($something = "")
{
    parent::__construct("planets_games");
}

Then just instantiate the class like normal

$pg = new planetsGames();
like image 42
ZombieCode Avatar answered Sep 19 '22 13:09

ZombieCode


This error message refers to the liskov substitution principle. It applies to every IS-A relationship (which is the meaning of using inheritance (extends)) and states that every subtype should be fully replacable for the super type.

But this doesn´t apply to constructors! Which php version you are using?

It seems the base class has marked the constructor as abstract. That´s the only way this error can appear.

You should never mark constructors abstract, final or put them in interfaces!

In most languages this isn´t even possible.

What you should take away from this is that the best-practice is that each concrete object has a constructor with a signature that best represents how a consumer should fully instantiate that particular object. In some cases where inheritance is involved, “borrowing” the parents constructor is acceptable and useful. Furthermore, it is encouraged that when you subclass a particular type, that your new type should, when appropriate, have its own constructor that makes the most sense to the new subtype.

http://ralphschindler.com/2012/03/09/php-constructor-best-practices-and-the-prototype-pattern

like image 156
Sebastian Keßler Avatar answered Sep 21 '22 13:09

Sebastian Keßler