PHP5 Inheritance/method override problem

From: Date: Wed, 06 Dec 2006 15:22:22 +0000
Subject: PHP5 Inheritance/method override problem
Groups: php.general 
Request: Send a blank email to php-general+get-245568@lists.php.net to get a copy of this message
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: richard@hddbroker.com Web Site: www.hddbroker.com

« previous php.general (#245568) next »