【发布时间】:2018-12-27 14:43:45
【问题描述】:
我认为php的OOP实现有问题。
编辑:考虑更多说明性示例:
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
问题是当Animal::Communicate是抽象方法时,php告诉下面的方法是非法的:
"公共函数 Communicate(Panda $partner)" "公共功能沟通(Human $partner)"
但是当 Animal::Communicate 是非抽象的但具有零实现的时候,Php 认为这些方法是合法的。所以在我看来这是不对的,因为我们在这两种情况下都进行了覆盖,而且这两种情况是相等的,所以这似乎是一个错误......
帖子的旧部分:
请考虑以下代码:
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) { ... }
}
}
以下代码在 MyDecorator.php 中给出错误提示
致命错误:MyDecorator::Decorate() 的声明必须与在线MyDecorator.php 中的A\Decorator::Decorate() 的声明兼容...
但是当我将 Framework.php::Decorator 类更改为以下实现时:
abstract class Decorator {
public function Decorate(\A\Component $component) {}
}
问题消失了。
【问题讨论】:
标签: php