Php:覆盖抽象方法出错

标签 php

我认为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/

相关文章:

javascript - Ajax 200 执行成功/失败

php - 对用户 PC、PHP 或 JS 进行基准测试的最佳方法是什么?

php - 显示 1 而不是全部 out 数据库

php - 如何以特定的窗口宽度显示 HTML 元素?

php - 如何编码法语/西类牙语字符以使用 clickatell 的 http api?

php - 输入错误内联

PHP fatal error : Uncaught Error: Class 'ZipArchive' not found in

php - Nginx clean urls,如何将文件夹重写为 try_files 的参数

php - 如何在php中将自动加载与命名空间一起使用?

php://输入用于文件上传?