多个类中的全局变量

时间:2011-05-20 11:23:55

标签: php oop

让我说我有这样的事情:

<?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变量的类。

现在,问题是:我如何只定义一次配置,并使其可以在所有类中访问?

由于

3 个答案:

答案 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;
      }
   }
?>