2011-12-02 4 views
-3

可能性の重複:
Why is my constructor still called even if the class and constructor case are different?PHPでバグが見つかったのですか?何か逃しましたか?

<?php 
abstract class foo { 
    function foof() { 
    echo "Hello, I'm foo :)"; 
    } 
} 

class foo2 extends foo { 
    function foo2f() { 
    $this->foof(); 
    } 
} 

class foo3 extends foo2 { 
    function foo3f() { 
    $this->foo2f(); 
    } 
} 

$x = new foo3; 
$x->foo3f(); 
?> 

このコード出力(予想通り) "こんにちは、私がfoo :)だ" しかし、私はこのような何かにコードを変更するとき: http://pastebin.com/wNeyikpq

<?php 
abstract class foo { 
function fooing() { 
    echo "Hello, I'm foo :)"; 
} 
} 

class foo2 extends foo { 
function foo2() { 
    $this->fooing(); 
} 
} 

class foo3 extends foo2 { 
function foo3() { 
    $this->foo2(); 
} 
} 

$x = new foo3; 
$x->foo3(); 
?> 

PHPプリント:

こんにちは、私はFOOよ:)こんにちは、私はFOO :)

なぜですか?バグですか?

+0

私が原因なペーストビン上の第2のコードを置きますstackoverflowへのバグ(笑) - http://cl.ly/3J352B14073S15282O2s – kiler129

+3

これはPHPのバグではなく、StackOverflowのバグではありません。 –

+4

一般的には、あなたが質問したことがあれば(たとえ渡してもそれを言いますが)、あなたが書いたコードではなく、使用している言語にバグがあると仮定すれば、ここで人々の怒りを引きます。 – jwiscarson

答えて

8

function foo2()foo2にfoo2を2回呼び出すため、コンストラクタです。

+1

+1これは正しいです。 [コンストラクタとデストラクタ](http://php.net/manual/language.oop5.decon.php)を参照してください。 –

+6

_ passersby_の注:クラスと同じ名前のメソッドは、PHP4との下位互換性のためのコンストラクタとして扱われます。 PHP5以降、['__construct()'](http://php.net/manual/en/language.oop5.decon)を使用してください。php)メソッドを使用します。 – Wiseguy

+1

ありがとう、私はそれを知らない! – kiler129

4

正解はfunction foo2()で、foo2はコンストラクタですが、コンストラクタであることは間違いありません。

答えはfoo3()new foo3()で呼び出されるコンストラクタです。このコンストラクタは、メソッドfoo2()を呼び出します。

foo3が親コンストラクタを呼び出さないため、実際にはfoo2という新しいコンストラクタが呼び出されます。


あなたはfoo3() 2回呼び出しているので、foo3function foo3()constructor Docs次のとおりです。

後方互換性のため

、PHP 5は、与えられたクラスの__construct()関数を見つけることができない場合、それは検索します古いスタイルのコンストラクタ関数の場合はクラス名で指定します。

最初の呼び出し:

$x = new foo3; 

第二コール:

$x->foo3f(); 

foo3に本当のコンストラクタを与え、あなたは罰金だ:

class foo3 extends foo2 { 
function __construct() {}; 
function foo3() { 
    $this->foo2(); 
} 
} 
+0

+1、あなたは実際に最初に正確に作り出しました。 – hakre

関連する問題