“命名空间”,常量和多个PHP包括

时间:2009-05-19 12:55:48

标签: php namespaces include

我有一些类似于以下内容的PHP代码:

foreach ($settingsarray as $settingsfile)
{
    include ($settingsfile);
    // do stuff here
}

$ settingsarray是特定文件夹中的文件名数组。

问题是,每个$ settingsfile定义了常量(具有相同的名称),当然,这些常量不能重新定义。

有哪些方法可以防止在这种情况下发生错误?

我能想到的两个选项包括:将所有常量更改为变量并使用PHP命名空间。

但是,我不确定如何使用命名空间,它需要在每个$ settingsfile的开头声明?有没有一种在不使用命名空间的情况下隔离常量,变量和函数的方法?

我真正喜欢的是能够做一些简单的事情:

foreach ($settingsarray as $settingsfile)
{
    {//added braces to indicate where the isolation is
        include ($settingsfile);
        // do stuff here
    }//what happens in here does not affect what happens outside of here
}

我应该注意,这是新功能的一部分,并且是加载所有$ settingsfiles的代码的唯一部分。其余的代码只能一次加载一个文件。我使用常量的一个原因是我不必担心定义变量“global”以便能够在函数内访问它们。

5 个答案:

答案 0 :(得分:4)

我的回答有点复杂,但应该很适合你。我假设您有大量这些设置文件,因为您不愿意单独更改每个文件。

如果您能够使用名称空间,我假设您已经升级到PHP 5.3RC2。将以下内容复制到.php文件中,并根据您的喜好更改名称空间:

<?php
namespace myapp\config;

function define($key, $val) {
    Config::set($key, $val);
}

class Config {
    private $vars = array();

    // This class should not be instantiated
    private function __construct() {}

    public function set($key, $val) {
        self::$vars[$key] = $val;
    }

    public function get($key) {
        return isset(self::$vars[$key]) ? self::$vars[$key] : NULL;
    }
}

?>

在您的代码中包含它,现在让一切正常工作只需更改

即可
<?php

在您的设置文件中

<?php namespace myapp\config;

如果你有很多这样的话,终端上的快速'sed'命令应该很好地处理它,一下子就完成了。

如果我让你失去了如何使用我的代码,这里有一个例子:

<?php
require_once('the_php_file_i_just_gave_you.php');
use \myapp\config\Config;

foreach ($settingsarray as $settingsfile) {
    include ($settingsfile);
    $varname = 'key';
    echo "In this file, '$varname' equals: " . Config::get($varname);
}

?>
祝你好运!

答案 1 :(得分:1)

好的,所以如果我正确地理解你,那么在你需要用每个$settingsfile内定义的常量来做事情,然后在每个循环之后基本上去掉它们?

  

与变量不同,常量是一旦设置,在执行脚本期间无法更改或取消设置的值   src

您唯一的选择是将define()声明更改为变量。

答案 2 :(得分:1)

不容易,但你可以用file_get_contents($ settingsfile)读取php文件,然后重写常量,并评估代码。

$settingsstr = file_get_contents($settingsfile);
$settingsstr = preg_replace('/<\?\w*(.*)/', '\\1', $settingsstr);//get rid of the php open tag
$settingsstr = preg_replace('/define\("(\w+)"/', 'define("NAMESPACE_\\1"', $settingsstr);
eval($settingsstr);

答案 3 :(得分:1)

您有几个选择:

使用PHP命名空间

令人惊讶的是,PHP确实支持namespaces。我很惊讶地发现这一点,因为我已经在PHP工作了多年,从未听说过这个功能。它可能是一个较新的功能,并且不常用,所以我建议不要使用此方法

使用类常量

您可以使用课程和class constants加载您的设置。类常量是定义类的本地,因此您不必担心类中的名称冲突。您可能需要做的不仅仅是包含文件,但是您可以在每个类上调用一个方法,例如defineConstants()或loadConfiguration(),它们将定义应用程序常量,保持类常量供内部使用。

使用功能扩展设置

另一个想法是创建一个设置数组和单独的函数来“扩展”这些设置。这样,您可以在后续函数中覆盖任何配置而不会导致错误。最后,如果你想把它们放在常量中,你可以遍历数组并使用define()来定义常量。

还有很多其他方法可以完成你想要做的事情,但这只是一些想法。

答案 4 :(得分:0)

设置文件不应包含PHP代码。 它应该是某种“标准”格式。 http://www.php.net/parse_ini_file

  • 在第一步(在您的foreach中),您阅读所有文件
  • 将变量收集到临时数组
  • 在此数组的另一个循环中,您可以将它们定义为常量。

如果您经常感到需要“重新定义常量”,那么应用程序设计中的某些东西是不对称的。