如何将另一个文件中的变量分配给类常量?
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 函数和用户输入的变量插入表中?