2012-09-18 80 views
0

我想合併兩個php項目。這兩個項目都使用全局變量,所以我想要有單獨的全局範圍。PHP:包含獨立的全球範圍

例子:

文件project1.php:

$var1 = 'var1'; 

function print1() { 
    global $var1; 
    echo $var1; 
} 

print1(); 

文件project2.php:

function load1() { 
    include('project1.php'); 
} 

$var2 = 'var2'; 

function print2() { 
    global $var2; 
    echo $var2; 
} 

print2(); 
load1(); 

這將只是按預期執行項目2,但因爲$ VAR1不PROJECT1會失敗在全局範圍內,但在load1()的範圍內。

一個可能的解決方法是在load1()中調用global $var1但是這會混合兩個全局作用域(messy)並且會很複雜,因爲reallive project2有許多全局變量,我將不得不檢查是否有任何新的每個更新的。

因此,如果我可以爲project1創建一個單獨的全局範圍,那將是最好的。那可能嗎?

+3

現在,你知道爲什麼**不使用全局變量!! **準備意大利麪。 – JvdBerg

+7

簡短回答:沒有。長答案:上帝沒有。您在這裏遇到的問題的實際解決方案是停止使用全局變量,並且只考慮您的頂級範圍,而不考慮是否是全局範圍。 – DaveRandom

+1

你也可以嘗試命名空間爲不同的文件... – feeela

回答

0

它是不可能有獨立的全球背景。無論發生什麼事,全球環境的全球唯一目的就是「全球化」。

爲了解決這個問題,你應該「情境」你的代碼重構全局變量函數參數:

function print2() { 
    global $var2; 
    echo $var2; 
} 

變爲:

function print2($var2) { 
    echo $var2; 
} 
0

如果你真的必須包裝你的包含在一個函數中,看看PHP Namespaces

project2.php:

namespace project2 { 
    $var2 = 'var2'; 

    function print2() { 
     global $var2; 
     echo $var2; 
    } 

    print2(); 
} 

namespace project1 { 
    function load1() { 
     global $var1; 
     include('project1.php'); 
    } 
    load1(); 
} 
+0

是不是C++風格的命名空間語法錯誤? – wroniasty

+0

不,它在PHP> = 5.3.0中也有效。 – AdamGold