1

この非常に奇妙な動作に遭遇しました。次のコード

class TestClass {
    function testClass() {
        echo "Don't show me!";
    }
}

$testing = new TestClass;

testClass呼び出されずにメソッドを実行します! ただし、 などのtestClass名前に変更すると実行されませんtestClass1。この動作の背後に隠された「PHP マジック」はありますか?

編集。最後に、PHP とともに育った忍者にとって、この質問は些細なことだと思います。PHP の最近の初心者として、私は__constructコンストラクターとして使用することを学びました。その「遺物の動作」を最新のチュートリアルから慎重に削除しました。クラス名を変更し、コンストラクターの名前を変更するのを忘れて、それがどれほどひどいものであるかを人々が認識してくれてとてもうれしいです-なんて悪夢でしょう!

4

2 に答える 2

6

PHP5 より前では、__constructメソッドはクラス コンストラクターとして使用されませんでした。代わりに、クラスと同じ名前のメソッドが使用されました。

ドキュメントから:

下位互換性のために、PHP 5 が特定のクラスの関数を見つけることができず__construct()、クラスが親クラスから関数を継承していない場合、クラスの名前で古いスタイルのコンストラクター関数を検索します。事実上、互換性の問題が発生する唯一のケースは、異なるセマンティクスに使用される __construct() という名前のメソッドがクラスにある場合のみであることを意味します。

(空の) コンストラクター ( という名前のメソッド) を作成する__constructと、クラスの初期化時にメッセージがエコーされなくなります (< PHP 5.3.3 * でのみ必要):

class TestClass {
    function __construct() {

    }
    function testClass() {
        echo "Don't show me!";
    }
}

* PHP 5.3.3以降、名前空間クラス名の最後の要素と同じ名前のメソッドはコンストラクタとして扱われなくなりました。この変更は、名前空間のないクラスには影響しません。

于 2013-09-29T16:20:41.430 に答える
1

古いバージョンの PHP では、クラス名と同じ名前のメソッドがコンストラクターと見なされていました。

于 2013-09-29T16:21:02.483 に答える