Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.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_Coding Style - Fatal编程技术网

如何在php中存储设置变量?

如何在php中存储设置变量?,php,coding-style,Php,Coding Style,我目前正在用php编写一个程序。我想让脚本的用户更改一些设置,比如数据库位置和用户。 这些变量放置在脚本的第一行 现在我想从脚本的任何地方访问这些变量,就像在类和函数中一样 我用了globals。但是一位同事告诉我不要使用globals 那么,在php中存储和访问设置的常用方法是什么呢?您可以在服务器中使用一个简单的sqlite db,以放置只有php程序才能访问的配置设置。通过将sqlite查询封装到一个简单的类中,您不必使用全局变量。您可以使用默认为全局变量的常量: define('APPL

我目前正在用php编写一个程序。我想让脚本的用户更改一些设置,比如数据库位置和用户。 这些变量放置在脚本的第一行

现在我想从脚本的任何地方访问这些变量,就像在类和函数中一样

我用了globals。但是一位同事告诉我不要使用globals


那么,在php中存储和访问设置的常用方法是什么呢?

您可以在服务器中使用一个简单的sqlite db,以放置只有php程序才能访问的配置设置。通过将sqlite查询封装到一个简单的类中,您不必使用全局变量。

您可以使用默认为全局变量的常量:

define('APPLICATION_SETTING', true);
否则,可以使用Registry Singleton类,在该类中加载设置并将其存储在类私有变量中。 经典注册表类结构:

class Registry {
    private $instance = NULL;
    private $vars = array();
    private __construct() {/**/}
    public static function getInstance() {/**/}
    public function get($key) {/**/}
    public function set($key, $value) {/**/}
}

不,我建议你不要使用注射和填充模式。只需使用Singleton。注射会使事情变得更糟、更复杂。

有几种方法。以下是一些选项:

  • 如果变量不变,可以使用常量
  • 您可以使用singleton配置对象(尽管很多人通常不赞成使用singleton;我个人认为在全局配置的情况下,它们可能非常有用)
  • 此外,您还可以将变量作为函数参数传递

这实际上取决于您正在开发的应用程序和个人偏好。不过,从长远来看,使用全局变量确实会变得笨拙。

在这种情况下,您的同事是错误的。Globals是存储需要在任何地方都可用的设置的最方便的方式。这就是全球性的,到处都有。PHP已经充满了全局变量,比如
$\u REQUEST
。我的建议是将设置放在一个名为
$settings
的全局数组中。

通过更改脚本中的变量来配置脚本是个坏主意

存储配置设置的最简单方法是使用.ini文件并使用parse_ini_file函数对其进行解析。

示例ini:

[db]
host = "foo.org"
user = "dbguy"

[session]
timeout = 600
如果您的脚本是面向对象的,您应该将配置设置包装在一个类中。。。并将其作为构造函数参数传递给主类

否则,您可以使用全局数组,但请不要在函数中使用“全局”关键字!函数应接受函数中的设置作为参数

$config = parse_ini_file("protectedFolder/config.ini", true);

//wrong, do not do it this way
function connect(){
  global $config;
  $connection = dostuff($config['db']['user'],$config['db']['host'];
  //do stuff
}

connect();

//right
function connect2($user, $host){
  $connection = dostuff($user, $host);
  //do stuff
}

connect2($config['db']['user'], $config['db']['host']);
这是一个非常简单的概念,有更好的方法可以做到这一点,但它应该让你开始,它将做简单的应用程序的工作

如果你需要更复杂的东西,你应该在谷歌上搜索“依赖注入”

编辑:编辑的评论
编辑2:修复了缺少引号的问题

有人能解释为什么使用globals不好吗??thanks@bingjie2680简单示例:您已经编写了一个应用程序并实现了所需的所有逻辑。现在,您希望将来自db的数据与来自另一个数据库的数据进行比较,但请稍候,您的dbConnect函数使用了global关键字,因此无法同时连接到两个数据库!你必须复制粘贴该函数并使用另一个全局函数。但是您的业务逻辑使用dbConnect返回的连接,因此您必须复制粘贴它们,并使用新函数交换dbConnect,但是构建逻辑……Jeff的解决方案就是这样。全局变量是危险的,因为它们可能会被意外修改。它们要求每个函数声明导入的全局变量列表。也许我不完全理解你的文本,但你不是有点自相矛盾吗?我引用“但是请不要在函数中使用'global'关键字”,但是在
函数connect()…
中,您可以继续这样做吗?您可以更进一步,将配置包装到类中以便于使用(但仍然根据需要传递特定的配置变量)。您还可以使用web服务器配置在您需要的每个vhost配置中设置$\u服务器环境中的一些值。常量是全局的(正如您自己所说的),因此我将避免使用这些常量。注册表模式可以工作,尽管它实际上是另一个名称的全局状态。如果您仅将其用于配置,那么我将不会有任何setter,也不会使其成为单例。单件使代码更难测试。