Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在我的所有类中获取配置变量?_Php_Oop - Fatal编程技术网

Php 如何在我的所有类中获取配置变量?

Php 如何在我的所有类中获取配置变量?,php,oop,Php,Oop,我有一个数组,其中包含类外部的配置数据,并且经常需要类内部这个数组中的值。在我的类中,获取这些值的最干净的方法是什么 <? $config["deco"] = "dark"; class Car { private $color; public function getColor() { return $this->color; } public function setColor($color) { $thi

我有一个数组,其中包含类外部的配置数据,并且经常需要类内部这个数组中的值。在我的类中,获取这些值的最干净的方法是什么

<?

$config["deco"] = "dark";

class Car {

    private $color;

    public function getColor() {
        return $this->color;
    }

    public function setColor($color) {
        $this->color = $config["deco"].' '.$color;
        // here I need a value from $config
    }

    public function __toString() {
        return "My car is ".$this->getColor()."\n";
    } 

}

$car = new Car();
$car->setColor("blue");
echo $car; // "My car is dark blue";

这就是你要找的吗

$config = array('deco' => 'foo', …

$car = new Car();

$car->setColor($config['deco'] . 'blue');
echo $car; // My car is fooblue

class Car {
    private $color;

    public function getColor() {
        return $this->color;
    }

    public function setColor($color) {
        $this->color = $color;
    }

    public function __toString() {
        return "My car is ".$this->getColor()."\n";
    } 

}

这就是你要找的吗

$config = array('deco' => 'foo', …

$car = new Car();

$car->setColor($config['deco'] . 'blue');
echo $car; // My car is fooblue

class Car {
    private $color;

    public function getColor() {
        return $this->color;
    }

    public function setColor($color) {
        $this->color = $color;
    }

    public function __toString() {
        return "My car is ".$this->getColor()."\n";
    } 

}

有两种方法可以做到这一点-您可以在需要配置的函数中使用global关键字:

public function setColor($color) {
    global $config;

    $this->color = $config["deco"].' '.$color;
    // here I need a value from $config
}
或者,我的首选方法是将config作为一个类,其中的值是静态可用的:

$config["deco"] = "dark";
class Config
{
  static $values = array(
    "deco" => "dark",
  );

  public static function get($name)
  {
    if (isset(self::$values[$name])) {
      return self::$values[$name];
    }
    return null;
  }
}

class Car {

    private $color;

    public function getColor() {
        return $this->color;
    }

    public function setColor($color) {
        $this->color = Config::get("deco").' '.$color;
        // here I need a value from $config
    }

    public function __toString() {
        return "My car is ".$this->getColor()."\n";
    } 

}

实际上,我的所有配置文件都在一个ini类型的文件中,config类解析该ini文件以构建数据数组,然后像上面那样访问该数组。。。但我将此作为练习留给读者

有两种方法可以做到这一点-您可以在需要配置的函数中使用global关键字:

public function setColor($color) {
    global $config;

    $this->color = $config["deco"].' '.$color;
    // here I need a value from $config
}
或者,我的首选方法是将config作为一个类,其中的值是静态可用的:

$config["deco"] = "dark";
class Config
{
  static $values = array(
    "deco" => "dark",
  );

  public static function get($name)
  {
    if (isset(self::$values[$name])) {
      return self::$values[$name];
    }
    return null;
  }
}

class Car {

    private $color;

    public function getColor() {
        return $this->color;
    }

    public function setColor($color) {
        $this->color = Config::get("deco").' '.$color;
        // here I need a value from $config
    }

    public function __toString() {
        return "My car is ".$this->getColor()."\n";
    } 

}

实际上,我的所有配置文件都在一个ini类型的文件中,config类解析该ini文件以构建数据数组,然后像上面那样访问该数组。。。但我把它作为练习留给读者

好吧,我发现了一个类似的问题


我最喜欢的是依赖注入

ok发现了一个类似的问题


我最喜欢的是依赖项注入

您的配置选项在整个应用程序中都是唯一的,因此在某个地方应该只有一个副本

如果您在全局范围内的任何地方都包含一个包含
$config
数组的文件,那么在类中访问它的最脏(也是最快)的方法就是使用
$GLOBALS['config'][“deco”]

但是,您可能会发现将配置值封装在类中更有用,可以作为静态变量:

class Config {

    public static $config = array(
       'deco' => 'dark' 
    ) ;

}
因此,您可以通过
Config::$Config['deco']
或作为Singleton类访问它:

class Config {

    private static $_instance = null ;

    public $config = array(
       'deco' => 'dark' 
    ) ;

    public static function getInstance() {

        if (self::$_instance == null || !self::$_instance instanceOf Config) {
            self::$_instance = new Config() ;
        }

        return self::$_instance ;
    }

}
然后使用
Config::getInstance()->Config[“deco”]


这两种方法都使您能够灵活地构建获取、存储、缓存配置值的功能,并通过确保配置值在尝试访问时实际存在、返回默认值等方式进行防御性编码。当然,您也可以向类中添加函数以实现“获取”语法更短。

您的配置选项在整个应用程序中是唯一的,因此在某些地方应该只有一个副本

如果您在全局范围内的任何地方都包含一个包含
$config
数组的文件,那么在类中访问它的最脏(也是最快)的方法就是使用
$GLOBALS['config'][“deco”]

但是,您可能会发现将配置值封装在类中更有用,可以作为静态变量:

class Config {

    public static $config = array(
       'deco' => 'dark' 
    ) ;

}
因此,您可以通过
Config::$Config['deco']
或作为Singleton类访问它:

class Config {

    private static $_instance = null ;

    public $config = array(
       'deco' => 'dark' 
    ) ;

    public static function getInstance() {

        if (self::$_instance == null || !self::$_instance instanceOf Config) {
            self::$_instance = new Config() ;
        }

        return self::$_instance ;
    }

}
然后使用
Config::getInstance()->Config[“deco”]



这两种方法都使您能够灵活地构建获取、存储、缓存配置值的功能,并通过确保配置值在尝试访问时实际存在、返回默认值等方式进行防御性编码。当然,您也可以向类中添加函数以实现“获取”语法更短。

您的类看起来很好。请解释您的用例,并给出一个示例$config数组,以及您希望如何在类中使用它。setColor()中有一条注释。我需要定义类之外的$config。您是否查看了
define()
?我是否可以使用define()从类内部访问?$config不在类中。好吧,将它传递到类中,这样您的类看起来就可以了。请解释您的用例,并给出一个示例$config数组,以及您希望如何在类中使用它。setColor()中有一条注释。我需要定义类之外的$config。您是否查看了
define()
?我是否可以使用define()从类内部访问?$config不在类中。好吧,然后将其传递到类中谢谢但抱歉不是我需要的,我更新了我的愚蠢问题:)谢谢但抱歉不是我需要的,我更新了我的愚蠢问题:)不完全是好的做法。使用
global
关键字会破坏封装并耦合到全局范围。使用静态类也会执行相同的操作,并将对Config类的依赖项硬编码到Car中。这是不可维护的,而且很难测试。@bees statics——出于任何实际目的——与globals相同。就我个人而言,我避免使用global——但我不知道你怎么能说使用静态类是不可维护的——这是我在上一份工作中与同事一起使用的一种模式,已经有好几年了。@Horus,那么是时候停止了;)。正如我所说,静态是有效的面向对象全局性。定义“可测试性”——单元测试不是测试代码的唯一方法,也不是很好的实践。使用
global
关键字会破坏封装并耦合到全局范围。使用静态类也会执行相同的操作,并将对Config类的依赖项硬编码到Car中。这是不可维护的,而且很难测试。@bees statics——出于任何实际目的——与globals相同。就我个人而言,我避免使用global——但我不知道你怎么能说使用静态类是不可维护的——这是我在上一份工作中与同事一起使用的一种模式,已经有好几年了。@Horus,那么是时候停止了;)。正如我所说,静态实际上是面向对象的全局变量。定义“可测试性”——单元测试不是测试代码依赖注入的唯一方法——正如对这个问题的回答所指出的——依赖注入并非没有它自己的功能issues@Horus所有建议的解决方案都有“各自的问题”,但是DI是问题最少的解决方案,依赖注入是什么,正如对这个问题的回答所指出的,依赖注入不是没有它自己的issues@Horus所有建议的解决方案都有“各自的特点”