2016-06-16 128 views
-2

我有一個PHP系統,它並沒有定義在函數中使用global $var;的變量的全局範圍,並且在服務器上工作,但在我的本地系統上沒有。

這是PHP的範圍規則的變化,還是有一個設置,允許這?我的本地系統運行php 5.5.36,我不知道服務器運行的是什麼版本。

編輯:添加代碼示例

這個工作運行的服務器

include_once("common.inc.php"); // this defines $physical_path 

class Admin extends AdminData 
{ 
    function Admin($admin_auth_id='') { 
     include_once($physical_path['DB_Access']. 'SubadminCommittee.php'); 
     // many more lines of code follow 
    } 
} 

這適用於本地PHP在36年5月5日

include_once("common.inc.php"); // this defines $physical_path 

class Admin extends AdminData 
{ 
    function Admin($admin_auth_id='') { 
     global $physical_path; // why is this line not needed on server? 
     include_once($physical_path['DB_Access']. 'SubadminCommittee.php'); 
     // many more lines of code follow 
    } 
} 
+2

代碼示例請。根據模糊的描述,我們無法對此進行任何說明。 – deceze

+0

@deceze我已經添加了一個代碼示例,不幸的是,我無法從服務器上重現這一點,我沒有一個地方可以創建一個簡單的示例。我沒有創建這個系統。 –

回答

1

變量$physical_path功能內部沒有global。這不是PHP版本或類似的任何差異,這是一個在PHP版本之間沒有區別的範圍確定事實。

可能的解釋是,$physical_path['DB_Access']計算結果爲null,並引發一個警告,您會忽略。因此,include_once線計算爲剛:

include_once('SubadminCommittee.php'); 

而這個相對路徑查找工作在服務器上,由於當前的工作目錄中有怎樣的腳本被調用,什麼是。在您的本地服務器上,這不起作用,因爲您的工作目錄不同和/或PHP的PATH值設置不同。

+0

我在服務器上設置了一個測試類,並確認$ physical_path變量爲空。如預期。該變量用於其他許多事情,所以我需要添加全局變量或將其替換爲工廠或單例。 –

+1

你絕對不應該使用'global';相反,依賴注入值到每個類的構造函數中。 – deceze

+0

我會在全局變量中使用除了大量數據以外的其他東西,但這是舊的PHP方式。我可能會通過它作爲參數或提供一個單例,或者使用Symfony來構建系統並讓它執行DI。 –

相關問題