0

此代码失败。但我不明白为什么。如果我将功能 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答案,命名空间类不再处理与构造函数同名的函数。但是非命名空间的类可以。仍然为什么不能在子实例中替换构造函数?

4

1 回答 1

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 个,这段代码可以工作

于 2013-10-19T06:02:59.737 回答