【问题标题】:Adding to a php const array dynamically?动态添加到 php const 数组?
【发布时间】:2025-12-14 19:05:02
【问题描述】:

我知道,从 php 5.6 开始,您可以将常量设置为数组,但是可以动态构建一个吗?

这行得通:

const FIELDS = array("email","firstName");

但我想运行一个填充常量的查询:

while($row = mysqli_fetch_assoc($results)) {
   const FIELDS[] = $row['field'];
}

但这不起作用。我也试过了:

while($row = mysqli_fetch_assoc($results)) {
  $array[] = $row['field'];
}
const FIELDS = $array;

但这也行不通。有没有办法做到这一点?还是必须对数组进行硬编码才能将其设置为常量?

【问题讨论】:

  • 使用define("FIELDS", $array)怎么样?不过,那将需要 PHP7。但是一个常数就是——一个常数!为什么不能使用变量来代替?是在课堂上使用吗?
  • 常数是常数。如果它发生变化,它就是一个变量。
  • @AlexBlex 我明白了,我并不想在使用过程中使其可变,只是在创建时从远程源中提取值
  • 您可以在定义 $array 之后使用 DEFINE('FIELDS', $array)... 但我严重怀疑您是否真的想要这样做,因为定义没有范围并且可能会减慢您的应用程序下来。
  • 您可以尝试扩展 ArrayAccess 类来实现某种不可变数组。当然你需要的并不完全是一个不可变的数据结构,而是你希望能够在初始化后冻结数据结构。

标签: php arrays constants


【解决方案1】:

尝试使用define('FIELDS', $array);。这允许您使用变量而不是文字字符串。 以下是有关 defineconst 的更多信息:define() vs const

这两种方式的根本区别在于 const 在编译时定义常量,而 define 在运行时定义它们 时间。

【讨论】:

    【解决方案2】:

    我完全承认这是对常量的不当使用,并且我已经将其更改为仅使用变量,但是 - 这就是我发现您可以完成它的方式:

    while($row = mysqli_fetch_assoc($results)) {
      $array[] = $row['field'];
    }
    DEFINE('FIELDS', serialize($array));
    print_r(unserialize(FIELDS));
    

    如果没有首先序列化数组,我无法让 DEFINE 方法工作(也许它在 7.0 中有所不同?)这需要您在输出之前对其进行反序列化。

    【讨论】: