【问题标题】:PHP Class extending an Abstract cannot run a function that has the same name as the Abstract Class扩展抽象的 PHP 类无法运行与抽象类同名的函数
【发布时间】:2013-10-19 05:31:25
【问题描述】:

此代码失败。但我不明白为什么。如果我将功能 lol 更改为其他功能,它就可以工作。如果我更改 Abstract 的类,它也可以工作。看到这个执行:http://codepad.viper-7.com/Z9V67x

<?php

abstract class Lol{

    abstract public function lol($external = false);

}

class Crazy extends Lol{

    public function lol($external = false){
            echo 'lol';
    }

}

$new = new Crazy;

$new->lol('fdgdfg');

返回的错误是:

Fatal error: Cannot call abstract method Lol::lol() in /code/Z9V67x on line 17 PHP Fatal error: Cannot call abstract method Lol::lol() in /code/Z9V67x on line 17

对同名函数和类进行了一些研究,在 PHP4 中,同名意味着构造函数。根据这个https://stackoverflow.com/a/6872939/582917 答案,命名空间类不再处理与构造函数同名的函数。但是非命名空间的类可以。还是为什么不能在子实例中替换构造函数?

【问题讨论】:

    标签: php oop abstract-class


    【解决方案1】:

    检查以下代码:

    abstract class Lol{
        public function __construct() { // only one constructor is really needed
        }
        abstract public function lol($external = false);
    }
    
    class Crazy extends Lol{
        public function __construct() { // only one constructor is really needed
        }
        public function Crazy() { // only one constructor is really needed
        }
        public function lol($external = false) {
            echo 'lol';
        }
    }
    
    $new = new Crazy();
    $new->lol('fdgdfg');
    

    它工作正常,为什么?

    PHP 在 OOP 方面不是很好,即使是最新版本,它也有 PHP4 遗留,所以让我们尝试了解 您的 代码是做什么的:

    1. 它定义了抽象函数,被php理解为构造函数和抽象方法
    2. 在子类中你只定义了方法,但构造函数仍然是抽象的

    这就是您在new 期间遇到错误的原因 - php 确实找不到构造函数

    现在检查上面的代码 - 它有 3 个构造函数,你可以有任何 1 个并且这段代码可以工作

    【讨论】:

    • 我明白了。虽然它不是很直观。希望它能消除 PHP4 的遗留问题。
    猜你喜欢
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多