如何将另一个文件中的变量分配给 class 常量?

How to assign a variable from another file to a class constant?

我有一组 API 键,它们在我的代码库中是不变的 - 我有一个开发键和一个实时键。它们存储在自己的 'keys.php' 文件中。

我有一个 class 来处理访问 API 并且我将密钥存储在 class 中作为 class 常量。

我希望能够将开发密钥换成实时密钥,并在我的 class.

的静态方法中访问它们

当我像这样分配 class 常量时,这工作正常:

const API_USER_NAME = 'user_name';

但想将密钥存储在自己的文件中,并将它们包含在 class 文件中,并定义这些常量:

const API_USER_NAME = $user_name;

但显然我无法将变量分配给常量,即使该变量在程序执行期间不会更改值。

有没有其他方法可以使用变量来赋值给常量?或者至少,将它们的密钥保存在它们的集中文件中,但仍然可以在我的 class?

的静态方法中访问它们

您可以使用 .env 来解决这个问题。

https://github.com/vlucas/phpdotenv

为了达到您想要的结果,您可以在项目中的受保护文件夹中定义一个 .env 文件,并将您的 gitignore 设置为不暂存您的 .env。 然后在生产环境中,您可以使用您的产品定义的常量设置一个 .env。 有很多框架使用 .env,Laravel 就是一个很好的例子。

您可以简单地将密钥本身定义为常量:

keys.php

const KEY_USER_NAME = 'user_name';
const KEY_USER_AGE = 'user_age';
// ...

Class

require $path_to_somewhere . '/keys.php';

class YourClass 
{
  const API_USER_NAME = KEY_USER_NAME;
  const API_USER_AGE = KEY_USER_AGE;

  // ...
}

您不能将变量分配给 class 常量,因为,as the documentation states:

The value must be a constant expression, not (for example) a variable, a property, or a function call.

变量求值发生在运行时,而 class 常量求值发生在编译时。设置 class 常量时,这些变量尚未准备好使用。

不过,看来您的设计确实有误,IMO。

如果那些常量属于 class,它们应该在那里定义,而不是在别处。并且不止一次定义(如果您使用外部值来初始化 class 常量,您将会这样做)。

因此要么直接在 class 中定义它们,要么在其他文件中使用 const 在不同的文件中定义它们,并将这些常量设置为全局可访问。

constants.php

const FOO = 'BAR';

consuming_file.php

require_once('constants.php');
var_dump(defined('FOO'));
// outputs bool(true)

如果您执意使用变量来定义这些常量,即使在其他地方定义,您也可以使用define()。这适用于变量表达式,因为它是在运行时评估的。但是 你不能在 class 定义中使用它们

更多constants.php

$bar = 'baz';
define('FOO', $bar);

echo FOO;
// outputs 'baz';

奇怪的是,使用 define() 定义的常量可以 用于使用 const 初始化 class 常量,无论原始常量如何定义的地方。