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

时间:2018-12-10 23:51:10

标签: php oop class-constants

我有一组在我的代码库中恒定的API密钥-我有一个开发密钥和一个活动密钥。它们存储在自己的“ keys.php”文件中。

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

我希望能够将开发键换成实时键,并以我班上的静态方法访问它们。

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

const API_USER_NAME = 'user_name';

但是要将密钥存储在自己的文件中,并将其包括在类文件中,并按如下方式定义这些常量:

const API_USER_NAME = $user_name;

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

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

3 个答案:

答案 0 :(得分:0)

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

https://github.com/vlucas/phpdotenv

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

答案 1 :(得分:0)

您可以简单地将自己的键定义为常量:

keys.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;

  // ...
}

答案 2 :(得分:0)

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

  

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

变量评估在运行时进行,而类常数评估在编译时进行。设置类常量时,这些变量尚未准备就绪。

还是,IMO,看来您的设计是错误的。

如果这些常量属于该类,则应在此处而不是其他位置定义它们。而且不会被定义多次(就像您在使用外部值初始化类常量时所做的那样)。

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

constants.php

const FOO = 'BAR';

standing_file.php

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

如果您倾向于使用变量来定义这些常量,即使在其他地方进行定义,也可以使用define()。因为它是在运行时求值的,所以它适用于变量表达式。但是您不能在类定义中使用它们

moreconstants.php

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

echo FOO;
// outputs 'baz';

很奇怪,无论原始常量的定义方式如何,使用define() 定义的常量都可以用于使用const初始化类常量。