Cytat
No właśnie, PHP mi nakazuje aby te metody były ze sobą kompatybilne, mimo tego, że nie są to metody abstrakcyjne. Stąd moje pytanie, jak do tego podejść.
W php nie ma przeciazania metod (ta sama nazwa a inne parametry) - wiec nadpisujesz metode w podklasie (zmieniasz jej implementacje), a wiec musza miec te same paramery.
Skoro ja nadpisujesz to musisz zachowac jej sygnature - typ parametru (skoro go specyfikujesz), czemu?
Z definicji OOP:
<?php
$c = new Concrete_C(); // extends C
$c->setObject( new A() ); // OK
?>
Tworzysz sobie obiekt typu C (czyli klasy C lub pochodnych == klasy C, D, Concrete, whatever).
Zgodnie z polimorfizmem mozesz wymienic obiekt na inna podklase klasy C, i powinienes miec mozliwosc wykonywania na nim tych samych operacji,
tu: przekazania obiektu klasy A do metody setObject(), ale
<?php
$c = new Concrete_D(); // extends D
$c->setObject( new A() ); // !!! NIE ZADZIALA, bo A nie jest B (dziedziczenie to relacja odwrotna, B jest A)
?>
Wiem ze PHP to nie Java/C# i ze jest dynamicznym jezykiem, ale po co w takim razie korzystasz z type-hintingu skoro nie chcesz sie do jego zasad dostosowac?
<?php
// phph 5.2.6
class A {
var $x = 3;
// Zestaw metod
protected $object = null;
}
class B extends A {
// Dodatkowy zestaw metod
}
abstract class C {
public function setObject(A $object) {
$this->object = $object;
}
}
abstract class D extends C {
public function setObject(B $object) {
$this->object = $object;
}
}
class Concrete extends D {
}
class Concrete_D extends D {
}
class Concrete_C extends C {
}
$c = new Concrete_C();
$c->setObject( new A() );
$c = new Concrete_D();
$c->setObject( new B() ); // przyjmuje tylko B
$c->setObject( new A() ); // z A nie zadziala
?>
// pomógł++
// ayeo