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所有建议的解决方案都有“各自的特点”