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

Posted

技术标签:

【中文标题】如何将另一个文件中的变量分配给类常量?【英文标题】:How to assign a variable from another file to a class constant? 【发布时间】:2019-05-11 22:19:17 【问题描述】:

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

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

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

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

const API_USER_NAME = 'user_name';

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

const API_USER_NAME = $user_name;

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

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

【问题讨论】:

define()php.net/define 我认为您应该查看类似 .ENV 的内容,例如 github.com/vlucas/phpdotenv 如果你在其他地方设置属性,那么它不是一个常数。请改用static 【参考方案1】:

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

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;

  // ...

【讨论】:

是的,我最终使用了 define() 并将它们作为类常量从全局常量加载。【参考方案2】:

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

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

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

不过,IMO,您的设计看起来确实是错误的。

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

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

constants.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 初始化类常量,无论原始常量是如何定义的。

【讨论】:

【参考方案3】:

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

https://github.com/vlucas/phpdotenv

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

【讨论】:

以上是关于如何将另一个文件中的变量分配给类常量?的主要内容,如果未能解决你的问题,请参考以下文章

将标准输入中的字符串分配给类成员变量

类加载与实例化

如何使用 PHP、SQL 和 Microsoft Access 将另一个表中的 select max 函数和用户输入的变量插入表中?

java内存分配(堆栈常量池)

将类变量作为默认值分配给类方法参数

python 类中的变量传递给类中的函数