2013-04-25 155 views
0

什麼是訪問變量超出範圍,最好的辦法,看看我現在的方法:PHP:超出範圍的變量訪問

// Define API 
require_once('api.php'); 
global $myapi; 
$myapi = new LazyAPI('My API', 'myapi'); 

class Content { 

    function DoAction() { 

     global $myapi; 
     $key = $myapi->someFunc() . "-key"; 

    } 

} 

$content = $myapi->Content(); // LazyAPI is a class that loads classes in other files using reflection 
$content->DoAction(); 

我面對(和我無法測試,直到進一步的)問題在其他文件中重新聲明或重新使用$myapi。我只使用了global訪問修飾符,因爲我知道它是有效的,我不知道是否有更好的選擇。這個想法是能夠聲明多個$myapi變量,並且只能在主文件的範圍內訪問。

+0

糾正我,如果我錯了。但是不能只在頂部執行'require_once()'並在函數'DoAction()'中實例化api嗎? – Tuan 2013-04-25 00:57:42

+0

'$ myapi'用於多個類。 – 2013-04-25 00:58:45

+0

我認爲你正在尋找單身模式。創建一個工廠類,無論您需要它,它都會返回'$ myapi'的相同實例。 – Tuan 2013-04-25 01:01:57

回答

1

使用depency injection

require_once('api.php'); 

class Content { 

    public function __construct($myapi) { 
     $this->myapi = $myapi; 
    } 

    function DoAction() { 
     $key = $this->myapi->someFunc() . "-key"; 
    } 

} 

$myapi = new LazyAPI('My API', 'myapi'); 
$content = new Content($myapi); 
$content->DoAction(); 

depency injection in PHP一些有用的幻燈片。

+0

變量'$ myapi'需要是一個變量,因爲它在幾個類中使用。我知道通過構造函數傳遞變量,但沒有更好的方法嗎? – 2013-04-25 01:00:00

+0

我也應該指出一些使得這個解決方案對我來說看起來「錯誤」的東西,請看原文。 – 2013-04-25 01:03:17

+0

@BrianGraham,通過這種方式,你的班級變得可測試,可重用,靈活......是的,這是最好的方式。 – sectus 2013-04-25 01:05:59