2

我有一组在我的代码库中不变的 API 密钥——我有一个开发密钥和一个实时密钥。它们存储在自己的“keys.php”文件中。

我有一个处理访问 API 的类,并且我将类中的键存储为类常量。

我希望能够将开发密钥换成活动密钥,并在我的类的静态方法中访问它们。

当我像这样分配类常量时,这很好用:

const API_USER_NAME = 'user_name';

但是想将密钥存储在他们自己的文件中,并将它们包含到类文件中,并像这样定义这些常量:

const API_USER_NAME = $user_name;

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

还有另一种方法可以使用变量分配给常量吗?或者至少,将它们的密钥保存在他们的集中文件中,但仍然在我的类的静态方法中访问它们?

4

3 回答 3

3

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

键.php

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

班级

require $path_to_somewhere . '/keys.php';

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

  // ...
}
于 2018-12-11T00:30:06.910 回答
2

您不能将变量分配给类常量,因为正如文档所述

该值必须是常量表达式,而不是(例如)变量、属性或函数调用。

变量评估发生在运行时,而类常量评估发生在编译时。设置类常量时,这些变量还没有准备好使用。

尽管如此,IMO 看起来您的设计确实是错误的。

如果这些常量属于该类,则它们应该在那里定义,而不是其他地方。并且没有多次定义(就像您使用外部值来初始化类常量时所做的那样)。

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

常量.php

const FOO = 'BAR';

消费文件.php

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

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

更多常量.php

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

echo FOO;
// outputs 'baz';

奇怪的是,使用 定义的常量define() 可以用来初始化类常量const,不管原始常量是如何定义的。

于 2018-12-11T09:18:56.640 回答
0

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

https://github.com/vlucas/phpdotenv

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

于 2018-12-11T00:04:31.750 回答