Как назначить переменную из другого файла константе класса? - PullRequest
0 голосов
/ 11 декабря 2018

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

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

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

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

const API_USER_NAME = 'user_name';

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

const API_USER_NAME = $user_name;

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

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

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

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

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 голосов
/ 11 декабря 2018

Нельзя присвоить переменную константе класса, потому что , как указано в документации :

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

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

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

Вы можете использовать .env для решения этой проблемы.

https://github.com/vlucas/phpdotenv

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

...