2013-08-27 50 views
3

我得到2 PHP文件 a.php只會如何理解關鍵字的PHP手冊「他們在使用之前類必須定義」,「擴展」

<?php 
class A extends B {} 
class B{} 

PHP a.php只會
>>>沒有錯誤

b.php

<?php 
class A extends B {} 
class B extends C {} 
class C{} 

PHP b.php
>>>>Fatal error: Class 'B' not found in b.php on line 2

[php.net manual]

在使用前

類必須定義!如果您想讓Named_Cart類 擴展Cart類,則必須先定義類 Cart。如果要根據Named_Cart類創建名爲 Yellow_named_cart的另一個類,則必須先定義 Named_Cart。爲了簡短起見,定義類別 的順序非常重要。

so anyboy請解釋爲什麼a.php沒有「致命錯誤」。

+0

它的行爲像一個功能:( – 2013-08-27 07:03:30

+0

@MarkBaker它給出同樣的錯誤,因爲OP已經聲明。 – Konsole

回答

2

根據PHP Inheritence doc。

除非使用自動加載,否則必須在使用 之前定義類。如果一個類擴展了另一個類,那麼父類必須在子類結構之前聲明的 。此規則適用於繼承其他類和接口的類。

這個例子具有用於類B和d沒有依賴關係:

<?php 
//This will work 
class A extends B {} //searches for class B in current document 
class B {} 

class C extends D{} 
class D{} 

類B依賴於C類

<?php 
//This will not work 
class A extends B {} //searches for class B in current document but class B has dependencies 
class B extends C {} 
class C{} 

對於包括和要求,則必須包括文件使用前該文件中聲明的函數/類。請參閱autoloading

+0

我仍然困惑2點1.爲什麼__autoload函數觸發,而我沒有明確調用它2.如果這個觸發__autoload在當前文件中找到類,爲什麼不b.php工作?或者這不會被遞歸觸發?非常感謝;) – Donald

+0

在這種情況下,不會觸發自動加載函數您需要編寫一些代碼來自動加載類php。我沒有嘗試,但使用自動加載可能會解決這個問題。這是一個很好的教程,使用自動加載在PHP http://www.codeforest.net/autoload-your-classes-in-php – Konsole

+0

我只是試過.. .autoload在這裏沒有觸發,並且這個函數不會解決問題,因爲加載文件本身會導致另一個undefine的問題。 – Donald

相關問題