meth(); check::equal(get_class($fooIntsObj), "Foo_integers", "wrong class"); check::equal($fooIntsObj->meth(42) , 42, "Foo_integers::meth(n) should return n"); // // Now subclass Foo_integers, but override its virtual method // meth(n) so that it returns the number plus one. // class MyFooInts extends Foo_integers { function meth($n) { return $n + 1; } } // // Subclass Bar and override its virtual method meth() // so that it returns a new MyFooInts instance instead of // a Foo_integers instance. // class MyBar extends Bar { function meth() { return new MyFooInts(); } } // // Now repeat previous tests: // // Create a MyBar instance... // $barObj = new MyBar(); // MyBar::meth should return a MyFooInts instance $fooIntsObj = $barObj->meth(); check::equal(get_class($fooIntsObj), "MyFooInts", "wrong class"); check::equal($fooIntsObj->meth(42) , 43, "MyFooInts::meth(n) should return n + 1");