2013-04-25 158 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