У меня есть набор ключей API, которые являются постоянными по всей моей кодовой базе — у меня есть ключ dev и живой ключ. Они хранятся в своем собственном файле «keys.php».
У меня есть класс, который обрабатывает доступ к API, и я храню ключи в классе как константы класса.
Я хочу иметь возможность менять ключи dev для живых ключей и получать к ним доступ в статическом методе моего класса.
Это прекрасно работает, когда я назначаю константу класса следующим образом:
const API_USER_NAME = 'user_name';
Но вы хотите сохранить ключи в своем собственном файле, включить их в файл класса и определить эти константы как таковые:
const API_USER_NAME = $user_name;
Но, очевидно, я не могу присвоить переменную константе, даже если эта переменная не изменит значение во время выполнения программы.
Есть ли другой способ использовать переменную для присвоения константы? Или, по крайней мере, хранить ключи в централизованном файле, но по-прежнему обращаться к ним в статических методах моего класса?
Вы можете просто определить свои ключи как константы:
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;
// ...
}
Вы можете использовать .env, чтобы решить это.
https://github.com/vlucas/phpdotenv
Чтобы достичь желаемого результата, вы можете определить файл .env в защищенной папке в вашем проекте и настроить свой gitignore, чтобы он не ставил ваш .env.
Затем в производственной среде вы можете установить .env с вашими константами, определенными в prodction.
Есть много фреймворков, которые используют .env, Laravel — хороший пример.
Вы не можете присвоить переменную константе класса, потому что, как говорится в документации:
Значение должно быть константным выражением, а не (например) переменной, свойством или вызовом функции.
Оценка переменных происходит во время выполнения, тогда как оценка констант класса происходит во время компиляции. При установке констант класса эти переменные еще не готовы к использованию.
Тем не менее, похоже, что ваш дизайн не так, IMO.
Если эти константы принадлежат классу, они должны быть определены там, а не где-либо еще. И не определено более одного раза (как было бы, если бы вы использовали внешние значения для инициализации констант класса).
Так что либо определите их там прямо в классе, либо определите их в другом файле, используя const
в другом файле, и установив эти константы глобально доступными.
constants.php
const FOO = 'BAR';
consuming_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
, как бы ни были определены исходные константы.