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 に答える