扩展Abstract的PHP类不能运行与Abstract Class同名的函数

时间:2013-10-19 05:31:26

标签: php oop abstract-class

此代码失败。但我不明白为什么。如果我将函数lol更改为其他任何函数,它就可以工作。如果我改变抽象的类,它也可以工作。请参阅此执行: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答案,命名空间类不再处理与构造函数同名的函数。 BUt非命名空间的类。仍然为什么不能在子实例中替换构造函数?

1 个答案:

答案 0 :(得分: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. 在子类中,您只定义了方法,但构造函数仍然是抽象的
  3. 这就是你在new期间收到错误的原因 - php真的找不到构造函数

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