2017-01-17 24 views
5

我知道在PHP中你可以定義一個類,而不管它在文件中的位置,你可以使用這個類。例如,看看下面的代碼:同一個文件中的類定義會導致致命錯誤

<?php 

//First case. No errors. 
class Second extends First{} 
class First{}; 

//Second case. Still nothing. 
abstract class B extends A{}; 
class C extends B{}; 
class A{}; 

//Fatal error! 
class C1 extends B1 { }; 
abstract class B1 extends A1{ }; 
class A1 { }; 
?> 

前兩種情況是好的,但不是最後一種。爲什麼?有規定嗎? Fatal Error

P.S;我使用PHP 5.6.25,Apache 2.4,CentOS 6.7。

+0

'class B1'?它在哪裏?你必須有一個課程來擴展它。 – PHPglue

+0

[請問PHP中的類定義的順序是否重要](http://stackoverflow.com/questions/3458756/does-the-order-of-class-definition-matter-in-php) – marian0

+0

@PHPglue Line 14. – undone

回答

2

我找不到一個書面的規則,但看到這樣的結果:

<?php 
//A1 Exists 
echo class_exists("A1")?"A1 Exists<br>":"A1 Not exists<br>"; 
//B1 Not exists 
echo class_exists("B1")?"B1 Exists<br>":"B1 Not exists<br>"; 
//C1 Not exists 
echo class_exists("C1")?"C1 Exists<br>":"C1 Not exists<br>"; 
class C1 extends B1 {}; 
class B1 extends A1{ }; 
class A1 { }; 
?> 

我可以計算出該解釋器的回顧與展望尋找父類,但是當你鏈接了第三層繼承,它不能預測B1將會存在。

如果你這樣做:

<?php 
//A1 Exists 
echo class_exists("A1")?"A1 Exists<br>":"A1 Not exists<br>"; 
//B1 Not exists 
class B1 extends A1{ }; 
class A1 { }; 
?> 

它說,「好吧,我沒有看到過A1類的聲明,但我看到它是未來」。

+0

我驗證了這個問題仍然存在於PHP 7.0中,並試圖說你的解釋是正確的。由於傳統原因,解析器似乎使用整個文件的標記化結果來「修補」不正確的聲明順序,但實際上只是在直接繼承鏈中解析它們。因此它在多個場景中始終在3級或更高級別上失敗。 –

1

我很抱歉地說,但這是不正確的,即使它看起來如此:

我知道,在PHP中,你可以定義一個類,無論其在文件中的位置,你可以使用班上。

讓檢查documentation

注: 類必須定義在使用前!如果您希望Named_Cart類擴展類Cart,則必須先定義類Cart。如果要基於Named_Cart類創建另一個名爲Yellow_named_cart的類,則必須先定義Named_Cart。簡而言之:定義類的順序非常重要。

+0

但前兩個都沒問題。在定義它之前,我擴展了「First」類。 – undone