2010-02-28 67 views
6

在Java中擴展類時,通過在導入語句中使用合格包名避免了類名歧義。例如:假設我想讓我的控制器擴展Spring的MultiActionController - 我將從標準Spring包中導入相同的內容。這也阻止了我擴展Mike或Perry的MultiActionController,因爲我沒有從它們的包中導入MultiActionController。在PHP中擴展類

同樣在PHP中,假設我們在10個不同的庫文件夾中有10個類,所有這些都稱爲MultiActionController。

當我寫:

class MyController extends MultiActionController { 
    function __construct() { 
     parent::__construct(); 
    } 
} 

我怎麼知道PHP這是MultiActionController(從哪個文件夾),從延長?

+0

是否有一個原因,爲什麼你限於PHP4?如果你使用PHP5和5.3或更高版本,你會得到更好的名字空間的例子。 – 2010-02-28 15:21:26

+0

不是。所以自動把這個,我不知道爲什麼。我在PHP 5.2.8上(這是我的主機提供的)。 – 2010-02-28 15:42:35

+0

我編輯了你的問題以刪除「php4」標記,並將其替換爲「php5」,所以事情很明確:-) – 2010-02-28 15:45:00

回答

1

PHP將擴展包含在include語句中的類。

例如,假設你已經在文件bar.php聲明的類Foo:在另一個FIE

class Foo { 
    // methods and fields 
} 

然後:

include 'bar.php'; 
class Aardvark extends Foo { 
    // this class will extend the class Foo in file bar.php 
} 
+0

謝謝,我一直是個白癡。 – 2010-02-28 15:41:39

2

這取決於你有哪一個。 PHP不會讓你重新定義一個類同名,所以只包含類定義的上方(改變以適應文件名和您的軟件佈局):

include('../includes/Spring/MultiActionController.php'); 

class MyController extends MultiActionController { 
    .... 
} 
+0

謝謝,我一直是個白癡。 ;) – 2010-02-28 15:42:02

1

你必須包括持有類的文件,與平庸include()聲明:

include('lib/controllers/MultiAction.php'); 

然後你可以擴展它!

+0

謝謝,我一直是個白癡。 – 2010-02-28 15:40:57

+0

每個人都需要學習!順便說一句,你應該讀一下'include()','require()'和'require_once()'之間的區別。如果php文件丟失,require()會以相同的方式執行,但會導致致命錯誤,並且require_once會避免多次從不同腳本中調用php文件,所以include()會引發非致命錯誤!可以在這裏查詢=> http://it.php.net/require_once – 2010-02-28 16:17:55

7

有幾個具有相同名稱的類會在某一天或那一天導致一些問題:在執行一個腳本時,不能包含兩個具有相同名稱的類 - 它會給你一個致命錯誤。

什麼是通常在PHP (在PHP 5.3和命名空間之前,至少)是在類名中包含庫和/或「包」的名稱。

例如,您可以有一個班級名稱MyLibrary_Package_MultiActionController,另一個名爲OtherLib_Blah_MultiActionController


那麼,什麼是一般做是使用類名稱,將其「地圖」對目錄和文件,通過「/」取代「_」,並在最後一個級別的末尾添加.php - 這之中通常使用autoloading feature of PHP來完成,以避免必須編寫大量的require指令。

例如,名爲MyLibrary_Package_MultiActionController的類應該存儲在MyLibrary/Package/MultiActionController.php中。


作爲旁註:你在標籤「php4」中,在你的問題中...如果你真的使用PHP 4,你不應該忘記它已經老了,不再被維護了(即使對於與安全有關的問題),而且PHP 5真的是要走的路!實際上,你將無法在PHP 4中做很多關於面向對象的編程;在PHP 4的面向對象的東西真的很基本...

(的東西,如自動加載,這是我寫的一個情侶款的早期並沒有存在於PHP 4 - 同爲public/private/protected和許多其他OO有關的東西......)

+0

Thx作爲迴應。我在PHP 5.2.8上(見我上面的回覆)。 – 2010-02-28 15:43:14

+0

確定關於PHP 5.2 vs PHP 4:這是個好消息:-) – 2010-02-28 15:44:02

0

我會用namaspaces

namespace package_products_multicontroller { 
include("/packages/products/multicontroller.php"); 
} 

class MyController extends package_products_multicontroller\MultiActionController { 
    function __construct() { 
     parent::__construct(); 
    } 
} 
+0

這似乎是最清楚的(閱讀:'最明確')的方式(儘管有點冗長,如果我敢說)。 – 2010-02-28 16:39:19