2010-10-03 60 views
1

所以senario是我想要一個自定義函數來需要庫。喜歡的東西:PHP中全局命名空間的運行功能塊

define('E_ROOT', str_replace('//','/',dirname(__FILE__))); 
/* ... */ 
function e_load($fn, $allowReloading = FALSE) { 
    $inc = E_ROOT.'/path/here/'.$fn.'.php'; 
    if($allowReloading) 
     require $inc; // !!! 
    else 
     require_once $inc; // !!! 
} 

的問題在於requirerequire_once將文件加載到的功能,這並不爲函數,類等等庫幫助的命名空間。那麼有沒有辦法做到這一點?

(有什麼避免requirerequire_once完全是罰款,只要它不使用eval,因爲它是這麼多的主機被禁止。)

謝謝!

+0

如果它真的是*庫*,而不是模塊,那麼它包含在 – 2010-10-03 15:00:18

+0

中的範圍並不重要,這是什麼意思? – 2010-10-03 15:03:15

+0

我的意思是圖書館通常只代表一個包含函數/類的文件 – 2010-10-03 16:05:31

回答

2

技術上include()意思好像你在你的PHP點插入包含腳本的文本採取行動。因此:

includeMe.php: 
<?php 
    $test = "Hello, World!"; 
?> 

includeIt.php: 
<?php 
    include('includeMe.php'); 
    echo $test; 
?> 

應該是完全一樣的:

<?php 
    /* INSERTED FROM includeMe.php */ 
    $test = "Hello, World!"; 
    /* END INSERTED PORTION */ 
    echo $test; 
?> 

認識到這一點,使得功能動態,包括文件的想法使大約多大意義(與大約是容易做到)因爲它們具有動態代碼。這是可能的,但它會涉及到很多元變量。

我想看看PHP中的Variable Variables以及將變量帶入全局範圍的get_defined_vars函數。這可能會喜歡的東西來完成:

<?php 
define('E_ROOT', str_replace('//','/',dirname(__FILE__))); 
/* ... */ 
function e_load($fn, $allowReloading = FALSE) { 

    $prev_defined_vars = get_defined_vars(); 

    $inc = E_ROOT.'/path/here/'.$fn.'.php'; 
    if($allowReloading) 
     require $inc; // !!! 
    else 
     require_once $inc; // !!! 

    $now_defined_vars = get_defined_vars(); 

    $new_vars = array_diff($now_defined_vars, $prev_defined_vars); 

    for($i = 0; $i < count($new_vars); $i++){ 
     // Pull new variables into the global scope 
     global $$newvars[$i]; 
    } 
} 
?> 

它可能會更方便,只需使用require()require_once()代替e_load()

注意,函數和常量應該始終是在全球範圍內,所以不管他們被定義在哪裏,他們都應該可以在代碼中的任何地方被調用。

對此的一個例外是在類中定義的函數。這些只能在類的名字空間內調用。

編輯:

我只是自己測試了一下。函數在全局範圍內聲明。我跑到下面的代碼:

<?php 
function test(){ 
    function test2(){ 
     echo "Test2 was called!"; 
    } 
} 

//test2(); <-- failed 
test(); 
test2(); // <-- succeeded this time 
?> 

所以test()已經運行後的功能只是定義,但功能是再從外面test()調用。因此,通過我之前提供的腳本,您應該需要將全局範圍拉到您的變量中。

0
require_once E_ROOT.$libName.'.php'; 

KISS

+0

我只希望libName不是來自用戶輸入 – 2010-10-03 14:58:52

+0

我的意思是$ libName來自函數。並且,是的—這個工作。但對於說10個不同的文件,這是很多不重複的文件。 – 2010-10-03 15:03:08

+0

與'e_load('libName')'對比。 – 2010-10-03 15:23:19

0

而不是做這個的......

$test = "Hello, World!"; 

...你可以考慮這樣做......

$GLOBALS[ 'test' ] = "Hello, World!"; 

在本地函數上下文和全局包含上下文中安全且一致。從視覺上提醒讀者,您希望$測試成爲全球化可能無害。如果你有大量的全局變量被你的庫拖入,也許有理由將它包裝在一個類中(然後你有spl_autoload_register的好處,無論如何你會做什麼)。