> -----Original Message-----
> From: Richard Morris [mailto:[EMAIL PROTECTED]
> Sent: Wednesday, December 06, 2006 10:22 AM
> To: [email protected]
> Subject: [PHP] PHP5 Inheritance/method override problem
>
> Hi,
>
> I came across this problem and I was wondering if someone might be able
> to explain to my why it is happening. I put together a short example to
> illustrate the problem that I am having.
>
> Basically I have one class that performs a certain task. I then have a
> second class which extends the first class and performs some tasks in
> addition to the first class. Even though ClassA should know nothing
> about ClassB since ClassA is the parent, ClassA actually calls ClassB's
> exist method when it should be calling it's own.
>
> I know that description is really wordy and probably confusing which is
> why I provided below the example code that illustrates the problem.
>
> Doesn't this break the idea of inheritance? I can get it to work if I
> change ClassB::exists to some other name such as ClassB::exists2.
>
> If anyone can enlighten me as to why this problem is occurring or
> suggest a fix I would really appreciate it. Thank you.
>
>
>
> expected output
> ---------------
> ClassB - save
> ClassA - save
> ClassA - exists
> ClassA - update
>
>
>
> actual output
> -------------
> ClassB - save
> ClassA - save
>
>
> Warning: Missing argument 2 for ClassB::exists(), called in
> /website/overridetest.php on line 6 and defined in
> /website/overridetest.php on line 33
>
> ClassB - exists
> ClassA - update
>
>
>
> overridetest.php
> ----------------
> <?php
> class ClassA {
> public function save($value) {
> echo "ClassA - save\n";
>
> if ($this->exists($value))
> $this->update($value);
> else
> $this->insert($value);
> }
>
> protected function insert($value) {
> echo "ClassA - insert\n";
> }
>
> protected function update($value) {
> echo "ClassA - update\n";
> }
>
> public function exists($value) {
> echo "ClassA - exists\n";
> return true;
> }
> }
>
> class ClassB extends ClassA {
> public function save($value, $classAValue) {
> echo "ClassB - save\n";
> parent::save($classAValue);
> // do some additional work...
> }
>
> public function exists($value, $classAValue) {
> // does a different search than ClassA
> echo "ClassB - exists\n";
> return true;
> }
> }
>
> $c = new ClassB();
> $c->save('test', 'test2');
> ?>
>
> --
> Richard Morris
> HDD Broker, Inc.
>
> Toll-Free: +1 866 960-3331
> International: +1 250 474-6022
> Fax: +1 250 474-6099
> E-Mail: [EMAIL PROTECTED]
> Web Site: www.hddbroker.com
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>
Here you have defined $c as a ClassB object.
ClassB has all the functions and variables of ClassA, plus those of ClassB.
If you define a function in ClassB which has the same name as a function in
ClassA, it will override it.
"$this" refers to the ClassB object (even inside the ClassA function), since
you defined $c as a ClassB object. Therefore, the function exists() will be
the ClassB function.
I would suggest you rename the ClassB exists() function in order to do what
you want to do.
Here is a good example to play with that will help you understand
inheritance a bit better.
<?php
class a
{
function showInfo()
{
print "I am class " . get_class($this) . ", my parent is "
.get_parent_class($this);
}
}
class b extends a {}
class c extends b {}
$myInstanceB = new b();
$myInstanceB->showInfo();
print "<br />";
$myInstanceC = new c();
$myInstanceC->showInfo();
/*
output:
I am class b, my parent is a
I am class c, my parent is b
*/
?>
Good luck and I hope that helps :)
-B
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php