我认为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 告诉下面的方法是非法的:
“公共(public)功能沟通( Pandas $伙伴)” “公共(public)功能 Communicate(Human $partner)”
但是当 Animal::Communicate 是非抽象的但具有零实现时,Php 认为这些方法是合法的。所以在我看来这是不对的,因为我们在两种情况下都进行了重写,并且这两种情况都是相同的,所以这似乎是一个错误...
帖子的较早部分:
请考虑以下代码:
Framework.php
namespace A
{
class Component { ... }
abstract class Decorator {
public abstract function Decorate(\A\Component $component);
}
}
实现.php
namespace B
{
class MyComponent extends \A\Component { ... }
}
MyDecorator.php
namespace A
{
class MyDecorator extends Decorator {
public function Decorate(\B\MyComponent $component) { ... }
}
}
下面的代码给出了MyDecorator.php中的错误告诉
fatal error :MyDecorator::Decorate() 的声明必须与在线MyDecorator.php 中的A\Decorator::Decorate() 的声明兼容...
但是当我将 Framework.php::Decorator 类更改为以下实现时:
abstract class Decorator {
public function Decorate(\A\Component $component) {}
}
问题消失了。
最佳答案
我不确定(还没有测试过;),但是你声明了这个抽象函数:
public abstract function Decorate(\A\Component $component);
所以你应该像那样实现它。但是你这样做了:
public function Decorate(\B\MyComponent $component) { ... }
这不一样。您可以尝试将其更改为 \A\Component
吗?
致所有评论:事实是这段 PHP“运行”
namespace A
{
class Component { }
abstract class Decorator {
public abstract function Decorate(\A\Component $component);
}
}
namespace B
{
class MyComponent extends \A\Component { }
}
namespace A
{
class MyDecorator extends Decorator {
public function Decorate(\A\Component $component) {}
}
}
这不是:
<?php
namespace A
{
class Component { }
abstract class Decorator {
public abstract function Decorate(\A\Component $component);
}
}
namespace B
{
class MyComponent extends \A\Component { }
}
namespace A
{
class MyDecorator extends Decorator {
public function Decorate(\B\MyComponent $component) {}
}
}
?>
出现此错误:PHP fatal error :A\MyDecorator::Decorate() 的声明必须与第 18 行的 A\Decorator::Decorate() 的声明兼容
现在您可以随心所欲地讨论应该或不应该如何,但这就是代码的问题。
所以,为了满足我自己的好奇心:这也是非法的:
<?php
class Component { }
abstract class Decorator {
public abstract function Decorate(Component $component);
}
class MyComponent extends Component { }
class MyDecorator extends Decorator {
public function Decorate(MyComponent $component) {}
}
?>
它不是 namespace 或任何东西。这似乎不合法。
关于Php:覆盖抽象方法出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4704533/