2011-12-02 58 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(); 
?> 

這段代碼輸出 「你好,我是富:)」(如預期),但是當我改變的代碼是這樣的: 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打印:

你好,我是富:)你好,我是富:)

爲什麼?這是一個錯誤嗎?

+0

我把第二個代碼上,由於引擎收錄到stackoverflow錯誤(哈哈) - http://cl.ly/3J352B14073S15282O2s – kiler129

+3

這不是PHP中的錯誤,這不是StackOverflow中的錯誤。 –

+4

總的來說,如果你的問題假設(即使你只是簡單地提到它),你會在這裏畫人的憤怒,說你正在使用的語言有一個錯誤,而不是你寫的代碼。 – jwiscarson

回答

8

因爲你打電話給foo2兩次,function foo2()foo2這是一個構造函數。

+1

+1這是正確的。請參見[構造函數和析構函數](http://php.net/manual/language.oop5.decon.php)。 –

+6

_爲過路人_注:與其類相同名稱的方法被視爲與PHP4向後兼容的構造函數。從PHP5開始,你應該使用['__construct()'](http://php.net/manual/en/language.oop5.decon。PHP)方法。 – Wiseguy

+1

謝謝,我不知道! – kiler129

4

正確答案不是function foo2()foo2這是一個構造函數,儘管它是一個構造函數。

答案是foo3()是在new foo3()中調用的構造函數。此構造函數調用方法foo2()

其實foo2更新的構造函數被調用,因爲foo3尚未調用其父構造函數。


因爲你調用foo3()兩次,function foo3()foo3constructor Docs

爲了向下兼容,如果PHP 5無法找到一個給定類__construct()函數,它將搜索對於舊式構造函數,按類的名稱。

第一次調用:

$x = new foo3; 

第二個電話:

$x->foo3f(); 

foo3一個真正的構造函數和你的罰款:

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

+1,你實際上是先創造出來的。 – hakre

相關問題