Hmm, looks like my reply got lost. Here's my ideas:
Instead of parent::__construct() use Class1::__construc(). This way, you go straight to the top-level constructor without going through the middle constructors. This means that you *must* overload __construct in all child classes or else the constructor of the immediate parent will be called.
If you want to leave the option of no child constructor open, you could use something like:
parent::__construct(); if(strtolower(get_class($this)) == 'class2') { //do constructor things for class2 }
in the constructor for Class2. Then if Class3 has no constructor, the Class2 constructor code won't be run.
Frzzman wrote:
Yeah you understood me, thanks god :D but not fully :(
But the problem is right in your code (sorry :D)
What if I create an instance of ChildClass, its constructor won't be called (since it commented out), but if I un-comment its constructor, it will be called even if I create an instance of GrandChildClass?
Let me make some simple diagram ;)
Class1 <-- Class2 <-- Class3 <-- Class4
If I create an instance of Class4, then Class4's constructor and Class1's constructor must be called, neither Class3 nor Class2.
You can see that Class1's constructor will always be called, and the constructor of the lowest class in the class tree will be called.
I think this is a bit complex, I can define a final function in Class1, and call it in every deriver class constructor, it will solve the problem (I think) but it's not convenience, I want it done automatically...
Any idea are welcome :D
Chris wrote:
FrzzMan wrote:
Hi guys, hey don't laugh at the subject, in fact I don't what to call it, so let's call it super constructor :DI'm not positive I understand you correctly, but I think this will answer your question.
Let's see following code...
class Base { __construct() { // Do something } }
class One extends Base { __construct() { // Do nothing } }
class OneMore extends One { __construct() { // Do things :D } }
So when I create an instance of OneMore class by:
$OneMoreInstance = new OneMore()
The __construct() method of class OneMore will be called, not the one of One and Base, right?
So is there any way around to make the Base class have a contructor that will be called everytime one of its child initialize?
My problem, I want all of the classes in my object are extend from one base class, so they are all have some common properties and function, but PHP won't implicit call the contructor (that's the right way)... btw, in my case, this is bad, as bad as every constructor would be called...
Well, hope you understand what I'm trying to say...
Example Classes: class ParentClass { function __construct() { echo 'ParentClass::__construct()',"\r\n"; } } class ChildClass extends ParentClass { /* function __construct() { parent::__construct(); echo 'ChildClass::__construct()',"\r\n"; } //*/ } class GrandChildClass extends ChildClass { function __construct() { parent::__construct(); echo 'GrandChildClass::__construct()',"\r\n"; } }
__construct is just like any other method, if you overload it (redefine it in a child class), the parent method will not be called automatically, so, if you want the functionality of both, you can call the parent constructor from the childs constructor. If the direct parent doesn't have a constructor, the next parent's constructor is checked and so on.
In the above example when defining a GrandChildClass, its constructor and the ParentClass::__construct() are will both run. If you uncomment ChildClass::__construct(), it will run as well.
-- paperCrane <Justin Patrin>
-- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php