Как назначить переменную из другого файла константе класса?

У меня есть набор ключей API, которые являются постоянными по всей моей кодовой базе — у меня есть ключ dev и живой ключ. Они хранятся в своем собственном файле «keys.php».

У меня есть класс, который обрабатывает доступ к API, и я храню ключи в классе как константы класса.

Я хочу иметь возможность менять ключи dev для живых ключей и получать к ним доступ в статическом методе моего класса.

Это прекрасно работает, когда я назначаю константу класса следующим образом:

const API_USER_NAME = 'user_name';

Но вы хотите сохранить ключи в своем собственном файле, включить их в файл класса и определить эти константы как таковые:

const API_USER_NAME = $user_name;

Но, очевидно, я не могу присвоить переменную константе, даже если эта переменная не изменит значение во время выполнения программы.

Есть ли другой способ использовать переменную для присвоения константы? Или, по крайней мере, хранить ключи в централизованном файле, но по-прежнему обращаться к ним в статических методах моего класса?

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;

// ...
}
0

Другие решения

Вы можете использовать .env, чтобы решить это.

https://github.com/vlucas/phpdotenv

Чтобы достичь желаемого результата, вы можете определить файл .env в защищенной папке в вашем проекте и настроить свой gitignore, чтобы он не ставил ваш .env.
Затем в производственной среде вы можете установить .env с вашими константами, определенными в prodction.
Есть много фреймворков, которые используют .env, Laravel — хороший пример.

0

Вы не можете присвоить переменную константе класса, потому что, как говорится в документации:

Значение должно быть константным выражением, а не (например) переменной, свойством или вызовом функции.

Оценка переменных происходит во время выполнения, тогда как оценка констант класса происходит во время компиляции. При установке констант класса эти переменные еще не готовы к использованию.

Тем не менее, похоже, что ваш дизайн не так, 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, как бы ни были определены исходные константы.

0