3

是否可以在 PHP 中解析常量的内容?

例如,

define('WHO_AM_I', 'My name is $_SESSION['who_am_i'].'); // setup the constant string
echo eval(WHO_AM_I); // something like this -- but the eval() returns an error

请注意,直到我稍后在脚本流中实际使用该常量时,我​​才知道 _SESSION var 的值。

谢谢。

修改了想要这样做的原因

我想从我的脚本中提取“硬编码”,并让用户能够在他们的站点中配置某些分类法。因此,当我这样做时,我还想创建一个准动态常量,我认为我可以稍后在脚本中解析它。

如果做不到……那就做不到。

不过,不要因为我问这个问题而开枪。

避免所有这些混乱的最后评论

我的问题的目的与 eval() 函数无关。我真的很后悔一开始就把它放在那里。

我将 eval() 放在问题中只是为了向 stackoverflow 成员展示我做了一些准备,而不是问一个开放式的问题——嘿,给我一个解决方案,而我自己没有提出任何问题。所以请忽略eval()。

我想知道的是,我能否以某种方式制作一个define(),以便稍后在我的脚本中解析分配的值。就是这样,仅此而已。

修正案 C

我知道我可以执行以下操作,尽管我不想这样做:

define('PARSE_ABLE_CONSTANT_PART_A', 'My name is ');
define('PARSE_ABLE_CONSTANT_PART_B', '.');

...后来沿着脚本之路...

echo PARSE_ABLE_CONSTANT_PART_A . $_SESSION['who_am_i'] . PARSE_ABLE_CONSTANT_PART_B;

如果我可以使用常量中的嵌入式 var 使其更流畅,我只是不想这样做。

4

2 回答 2

2

正如其他用户指出的那样,这似乎很可疑。如果你愿意,你可以这样做:

define('WHO_AM_I', 'echo \'My name is \'.$_SESSION[\'who_am_i\'];');
eval(WHO_AM_I);

这将始终只是回显变量。您需要评估一个表达式 afaik。

只需阅读您的编辑。我认为您会更适合 .ini 文件,或者可能是具有静态属性的静态类。使其更加灵活,并且您避免了评估。您正在谈论我所看到的用户生成的内容 - 将其置于 eval 调用似乎非常不安全。

您可以使用的静态类的快速示例:

<?php
class myConstants{
  public static function _($key){
    switch($key){
      case "WHO_AM_I":
        return "My name is ".$_SESSION['who_am_i'];
        break;
      case "OTHER_CONSTANT":
        // does some other evaluation and returns a string
        break;
    }
    throw new Exception("Constant isn't defined");
  }
}
?>

然后你可以echo myConstants::_('WHO_AM_I');

于 2013-01-23T22:24:59.370 回答
1

根据定义,常量不允许您使用动态内容对其进行设置。

这是 php 手册中的引用:

顾名思义,该值在脚本执行期间无法更改

去这里可以看到更多

你可能在想神奇的常数

于 2013-01-23T22:19:56.547 回答