That's what abstract classes are for. An abstract class basically says: Whoever is inheriting from me, must have this function (or these functions) abstract class whale { function __construct() { // some code here } function myfunc() { $this->test(); } abstract function test(); } class fish extends whale { function __construct() { parent::__construct(); } function test() { echo "So you managed to call me! "; } } $fish = new fish(); $fish->test(); $fish->myfunc().
That's what abstract classes are for. An abstract class basically says: Whoever is inheriting from me, must have this function (or these functions). Abstract class whale { function __construct() { // some code here } function myfunc() { $this->test(); } abstract function test(); } class fish extends whale { function __construct() { parent::__construct(); } function test() { echo "So you managed to call me!"; } } $fish = new fish(); $fish->test(); $fish->myfunc().
1 While correct, I think he wants to do $whale = new Whale; $fish = new Fish; and then $whale->myfunc(); is supposed to call $fish->test(); without knowing $fish exists. – Gordon Dec 22 '09 at 12:04 +1, abstract methods are generally the answer to your question of having parent classes refer to methods in child classes. If Gordon is correct and you're really trying to do something different/specific like that, you should clarify.
Otherwise, this should be accepted. – philfreo Dec 26 '09 at 4:40.
Technically, you cannot call a fish instance (child) from a whale instance (parent), but since you are dealing with inheritance, myFunc() will be available in your fish instance anyway, so you can call $yourFishInstance->myFunc() directly. If you are refering to the template method pattern, then just write $this->test() as the method body. Calling myFunc() from a fish instance will delegate the call to test() in the fish instance.
But again, no calling from a whale instance to a fish instance. On a sidenote, a whale is a mammal and not a fish ;).
This is just an example dude, I am not going to implement those names anywhere :) – Sarfraz Dec 22 '09 at 8:30.
Unfortunately there is no way to do it. Oh, and does a fish extend a whale? A fish is a fish, a whale is a mammal.
The only way you could do this would be through reflection. However, reflection is expensive and should only be used when necessary. The true problem here is that a parent class should never rely on the existence of a child class method.
This is a guiding principle of OOD, and indicates that there is a serious flaw in your design. If your parent class is dependent on a specific child, then it cannot be used by any other child classes that might extend it as well. The parent-child relationship goes from abstraction to specificity, not the other way around.
You would be much, much better off to put the required function in the parent class instead, and override it in the child classes if necessary. Something like this: class whale { function myfunc() { echo "I am a ". Get_class($this); } } class fish extends whale { function myfunc() { echo "I am always a fish."; } }.
I doubt it can be done with Reflection. Whale would have to have Fish hardcoded somewhere. – Gordon Dec 22 '09 at 8:28 that is great info :) – Sarfraz Dec 22 '09 at 8:29.
I'd go with the abstract class.... but in PHP you don't have to use them to make it work. Even the invocation of the parent class' constructor is a "normal" method call and the object is fully "operational" at this point, i.e. $this "knows" about all the members, inherited or not.
Class Foo { public function __construct() { echo "Foo::__construct()\n"; $this->init(); } } class Bar extends Foo { public function __construct() { echo "Bar::__construct()\n"; parent::__construct(); } public function init() { echo "Bar::init()\n"; } } $b = new Bar; prints Bar::__construct() Foo::__construct() Bar::init() i.e. Even though class Foo doesn't know anything about a function init() it can call the method since the lookup is based on what $this is a reference to. That's the technical side.
But you really should enforce the implementation of that method by either making it abstract (forcing descendants to implement it) or by providing a default implementation that can be overwritten.
Ok, well there are so many things wrong with this question I don't really know where to start. Firstly, fish aren't whales and whales aren't fish. Whales are mammals.
Secondly, if you want to call a function in a child class from a parent class that doesn't exist in your parent class then your abstraction is seriously flawed and you should rethink it from scratch. Third, in PHP you could just do: function myfunc() { $this->test(); } In an instance of whale it will cause an error. In an instance of fish it should work.
You could do: $food = new fish; $food->test().
Function of a child class from parent class is called (without quotes):. Call function of a child class from parent class.
I cant really gove you an answer,but what I can give you is a way to a solution, that is you have to find the anglde that you relate to or peaks your interest. A good paper is one that people get drawn into because it reaches them ln some way.As for me WW11 to me, I think of the holocaust and the effect it had on the survivors, their families and those who stood by and did nothing until it was too late.