2010-10-11 82 views
2

如果我有:PHP:require_once和繼承

<?php 
require_once("bla.php"); 
class controller{.....} 
php> 

如果我再在不同的文件class control_A extends controller{...}創建,我需要再說一遍require_once("bla.php");,抑或是遺傳嗎?

如果require_onceclass controller定義內完成,該怎麼辦?

謝謝!

JDelage

+0

這取決於'bla.php'的作用? – 2010-10-11 15:01:49

回答

6

到目前爲止,我們有兩個矛盾的,但同樣正確的答案=)讓我們看看,如果我不能合併兩成一個更具體的總答案。

如果任何類需要bla.php中的任何代碼或定義,那麼在腳本的整個運行時至少需要一次include("bla.php")。如果您以前的代碼:

<?php 
require_once("bla.php"); 
class controller{.....} 
php> 

是文件controller.php,然後你可以通過以下方式創建control_A

<?php 
require_once("controller.php"); 
class control_A extends controller{...} 
?> 

這是因爲require_once()功能基本上是複製和粘貼文件的內容到該行的腳本。因此,上述將被視爲相同的:

<?php 
/* INSERTED FROM controller.php */ 
/* INSERTED FROM bla.php */ 
necessary definitions for controller 
/* END bla.php */ 
class controller{.....} 
/* END controller.php */ 
class control_A extends controller{...} 
?> 

正如你所看到的,只是需要controller.php,用於控制必要的定義,現在看到和解析。你可以不是做的是省略controller的聲明。這不僅僅是因爲你在聲明它時需要bla.php,而且你也不能擴展一個尚未聲明的類。所以下面的代碼:

<?php 
class control_A extends controller{...} 
?> 

會給你一個錯誤,因爲控制器尚未定義。

但有一點需要考慮 - 因爲類controller沒有擴展任何其他類,所以不應該有任何外部依賴關係。很有可能無論你在bla.php中做什麼,在定義該類之前都必須運行,這是不必要的或者可以重新構造的。在定義controller之前,bla.php究竟做了什麼?

0

是的,你這樣做。 require_once "foo.php"有效地採用foo.php的內容並將它們粘貼(然後處理所有的 s和include s)。

+0

你的措辭沒有意義。你說它處理包含的文件需要/包括但是你也說你需要單獨需要文件(你不這樣做)。 – 2010-10-11 15:10:24

+0

啊,我在這裏看到這個問題。假設他在'foo.php'中定義了'Foo'類,並在該文件中包含了一些庫。憑藉擴展課程,他不會自動包含該圖書館。但是,因爲他包含'foo.php',他確實包含了有問題的庫。那有意義嗎? – 2010-10-11 16:15:40

2

只要你包含繼承的類,它不需要再次需要。

I.e.

class1.php:

<?php 
require_once("tools.php"); 
class class1 { 

} 
?> 

class2.php:

<?php 
require_once("class1.php"); 
class class2 extends class1 { 

} 
?>