让我说我有这样的事情:
<?php
namespace Twitter;
class Twitter {
function __construct()
{
$config = array ('api' => 'something', 'api_url' => 'something2');
}
// some code goes here
}
class TwitterConnection {
function __construct()
{
$config = array ('api' => 'something', 'api_url' => 'something2');
}
// some code goes here
}
?>
依此类推 - 会有更多使用$ config变量的类。
现在,问题是:我如何只定义一次配置,并使其可以在所有类中访问?
由于
答案 0 :(得分:7)
您可以创建一个配置对象,从您的数据源(ini,db,php文件...)读取并填充自身。然后给它一个getter,这样你就可以获得存储在其中的配置属性。
Config::get('someProperty')
设置此对象后,可以将其传递给类的构造函数,以便在内部使用。
class Twitter {
function __construct($config) {
$state = $config->get('someState');
}
}
您也可以在类中使用它而不通过将其作为静态类来注入它(您也可以轻松地创建新实例)。
class Twitter {
function __construct() {
//Don't recommend this, better to inject it.
$state = Config::get('someState');
}
}
修改强>
使用硬编码数组的最简单的配置类看起来像这样。我再次建议您从代码中移出配置。
class Config {
private $opts = array();
public function __construct() {
/**
* Ideally opts should be coming from some kind of easy to
* access configuration file
*
*/
$this->opts = array ('api' => 'something', 'api_url' => 'something2');
}
public function get($key) {
if (isset($this->opts[$key])) {
return $this->opts[$key];
}
return false;
}
}
class Twitter {
function __construct($config) {
echo $config->get('api');
}
}
$config = new Config();
new Twitter($config);
您还可以稍微更改一下这样的类,以便它可以在不需要自身实例的情况下工作。
答案 1 :(得分:0)
这里有几个不同的东西 - 配置数据存储,配置数据表示和使用。
对于存储,正如上面评论的martswite,你可以有一个配置文件。您还可以将配置数据存储在数据库中。
对于数据表示,您可以拥有一个数组,就像您在问题中显示的那样,或者是一个单独的完整对象。
通常,如果您有对某些数据具有依赖性的对象才能工作,则通过其构造函数将该依赖项传递( inject )。所以,大概是这样的:
class Example
{
private $dependency;
public function __construct($dependency)
{
$this->dependency = $dependency;
}
public function doSomething()
{
// do something with $this->dependency
}
}
如果您有许多需要相同依赖关系的对象,那么手动执行将非常繁琐。值得庆幸的是,有依赖注入容器可以自动执行大量进程。你在哪里找到这些容器? Google搜索应该会产生结果。也就是说,Symfony似乎是一个受欢迎的选择:http://components.symfony-project.org/dependency-injection/
所有这一切,理解和使用DI容器有一点学习曲线。不过,如果不在代码中引入全局变量,这可能是最好的方法。
最后,为了让您了解如何使用它,这里有一些伪代码:
// Load config data from file/db/some other source. Use it to populate an object (most likely) or array
// Set up the DI container to automatically inject the config data into the objects which require it
// Profit
答案 2 :(得分:-1)
尝试:
namespace Twitter;
$config = array ('api' => 'something', 'api_url' => 'something2');
class Twitter {
function __construct()
{
global $config;
}
}
class TwitterConnection {
function __construct()
{
global $config;
}
}
?>