Php: geçersiz kılma soyut yöntem yanlış gidiyor

0 Cevap

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.

0 Cevap