PHP'nin OOP uygulanmasında bir sorun olduğunu düşünüyorum.
EDIT: daha açıklayıcı bir örnek ele alalım:
abstract class Animal {
public $name;
// public function Communicate(Animal $partner) {} // Works
public abstract function Communicate(Animal $partner); // Gives error
}
class Panda extends Animal {
public function Communicate(Panda $partner) {
echo "Hi {$partner->name} I'm a Panda";
}
}
class Human extends Animal {
public function Communicate(Human $partner) {
echo "Hi {$partner->name} I'm a Human";
}
}
$john = new Human(); $john->name = 'John';
$mary = new Human(); $mary->name = 'Mary';
$john->Communicate($mary); // should be ok
$zuzi = new Panda(); $zuzi->name = 'Zuzi';
$zuzi->Communicate($john); // should give error
Sorun Hayvan :: İletişim soyut bir yöntem olduğu zaman, php aşağıdaki yöntemler yasadışı olduğunu söyler ki:
"public function Communicate(Panda $partner)" "public function Communicate(Human $partner)"
Hayvan :: İletişim soyut olmayan ama sıfır uygulaması olduğunda ancak Php bu yöntemlerin yasal olduğunu düşünüyor. Yani benim görüşüme göre biz her iki durumda kılma yapıyoruz, çünkü doğru değil, ve bu her iki durumda eşittir, bu yüzden bir hata var gibi görünüyor ...
Older part of the post:
Aşağıdaki kodu göz önünde bulundurun:
Framework.php
namespace A
{
class Component { ... }
abstract class Decorator {
public abstract function Decorate(\A\Component $component);
}
}
Implementation.php
namespace B
{
class MyComponent extends \A\Component { ... }
}
MyDecorator.php
namespace A
{
class MyDecorator extends Decorator {
public function Decorate(\B\MyComponent $component) { ... }
}
}
Aşağıdaki kod MyDecorator.php söylüyorum hatası veriyor
Ölümcül hata: MyDecorator :: Süsleme Beyanı () hattı üzerinde MyDecorator.php A \ Dekoratör :: Dekorasyon () bu uyumlu olmalı ...
Ama şu uygulanmasına Framework.php :: Dekoratör sınıfını değiştirmek:
abstract class Decorator {
public function Decorate(\A\Component $component) {}
}
sorun kaybolur.