【问题标题】:Simple class abstraction in php does not work (conflicting names?)php 中的简单类抽象不起作用(名称冲突?)
【发布时间】:2010-07-07 07:26:18
【问题描述】:

这是简单的php代码

<?
abstract class A{
abstract public function a($x);
}
class B extends A{
public function a($x)
{
echo $x;
}
}

$q = new B;
$q->a(10);
?>

给出: PHP 致命错误:无法调用抽象方法 A::a()

但是将函数的名称更改为“a”以外的其他名称是可行的。

那么调用 a(10) 到底发生了什么? 我没有看到这里的逻辑。

【问题讨论】:

    标签: php inheritance abstract-class


    【解决方案1】:

    你有一个非常明显的问题。由于您没有 __construct() 方法,因此 abstract public function a(); 是您的构造函数(php 4)。您的致命错误在实例化 B 类时触发,而不是在 B 类实例上调用方法 a() 时触发。

    如果您将方法名称 a() 更改为其他名称,则一切正常!

    有效的例子:

    <?php
    abstract class A
    {
        abstract public function test($x);
    }
    
    class B extends A
    {
        public function test($x)
        {
            echo $x;
        }
    }
    
    $q = new B();
    $q->test(10);
    ?>
    

    【讨论】:

    • 另一种方法是将__construct 添加到A
    • @Artefacto 触发 Strict Standards: Redefining already defined constructor for class A。至少如果您还保留功能a()。我想说这是一个很好的例子,向后兼容性实际上更像是一个错误。
    • @Gordon 我无法重现。请参阅codepad.viper-7.com/IgdKFi 我添加了一个调用,该调用生成了一个严格的错误以证明它已打开。
    • @Artefacto 参见codepad.viper-7.com/kDRSiq - 删除a()__construct 并且不会出现更严格的错误。丑陋。
    • @Gordon 显然是声明的顺序决定了是否有错误。不漂亮。
    猜你喜欢
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多