2009-05-19 34 views
2

我有类似下面的一些PHP代码:“命名空间”,常量和多个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。其余的代码一次只加载一个文件。我使用常量的一个原因是,我不必担心将变量“全局”定义为能够在函数内部访问它们。

回答

1

好吧,如果我正确地理解了你,那么在这个循环中,你想用每个$settingsfile中定义的常量来做事情,然后基本上在每次循环后摆脱它们?

与变量不同,一个不变的是,一旦设置的值,不能在您的脚本执行 src

你唯一的选择就是改变define()声明变量过程中改变或取消。

+0

你有我想要做的正确。解决方案,我不想听到。 (程序实际上非常复杂,这个代码来自一个新的特性,其余的代码只在特定的时间加载一个设置文件,把所有的常量改为变量将意味着改变所有的休息的代码以及...) – Alya 2009-05-19 14:19:46

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); 
+2

这只是尖叫“可怕的糟糕的黑客” – nickf 2009-05-19 13:56:18

1

您有几种选择:

使用PHP命名空间

出人意料的是,PHP实际上确实有namespaces支持。我很惊讶地发现这一点,因为我一直在PHP工作多年,从未听说过这个功能。这可能是一个新的特点,一个是不常用的,所以我不会使用这种方法

使用类常量

你可以使用类和class constants加载您的设置建议。类常量是定义类的局部属性,因此您不必担心类中的名称冲突。您可能需要做的不仅仅是包含文件,而是可以在每个类上调用一个方法,比如定义应用常量的defineConstants()或loadConfiguration(),并保持类常量供内部使用。

使用函数来扩展设置

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

还有很多其他方法可以完成您正在尝试做的事情,但这些只是一些想法。

+0

命名空间是PHP 5.3中的新功能,但尚未稳定发布。 – nickf 2009-05-19 13:58:19

0

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

  • 在第一步中(在你的foreach)你看过的所有文件
  • 收集变量放入一个临时数组
  • 在另一个遍历数组,你可以将它们定义为常量。

如果您经常感觉需要“重新定义常量”,那么在应用程序设计中就会出现一些问题。

+1

我不认为在PHP中定义的设置本质上没有任何问题。我不希望最终用户结束这些设置文件,但对我直接在PHP中编写设置的效率要高得多。 – nickf 2009-05-19 14:05:18

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); 
} 

?> 

祝你好运!