Динамическая (Shell Exec) определенная константа через функцию в PHP - PullRequest
0 голосов
/ 02 мая 2019

Я только что исследовал это в течение последнего часа, чтобы попытаться выяснить лучший способ сделать это.

Я работаю над приложением CLI PHP, которое использует следующую функцию, чтобы найти ширину командной строки.

function getColLen() {
    $getcolLen = shell_exec('tput cols');
    $colLen = (int) $getcolLen;
    return $colLen; 
}

Теперь у меня около 8 классов, с которыми я сейчас работаю, и эту функцию я использую довольно часто - в большинстве классов и во многих методах внутри классов.

Ранее он был просто включен в файл автозагрузки поставщика композитора functions.php, и я инициализировал его в каждой функции, например

public function Tagger()
    {
$colwidth = getColLen();

. . . . . 

и т. Д.

Я исследовал множество различныхварианты использования динамической глобальной переменной в классах PHP, из которых их много, а некоторые становятся довольно сложными.

Ради интереса я решил попробовать и это CONSTANT в моем functions.php файле

define('CLIWIDTH', getColLen());

Я не думал, что это сработает, поскольку вся информация, которую я прочитал - и все примеры, которые я видел, - касалась определения статических переменных, таких как строка или каталог.

Нок моему сюрприз, это прекрасно работает.Простое echo CLIWIDTH; в любом месте приводит к ширине командной строки (с успехом проверено для разных выходных данных при запуске консоли с разными размерами).

Не является ли это широко признанным правильным способом создания динамической переменной во всехфайлы?Возможно, я не искал правильные термины, но я никогда не слышал, чтобы кто-то использовал функцию внутри определенной константы, такой как эта.

Это правильный код?Есть ли причина, по которой это не рекомендуется при обсуждении констант, глобалов и т. Д.

Ответы [ 2 ]

1 голос
/ 02 мая 2019

Нет никаких ограничений на то, каким может быть аргумент значения для define(), и константа будет определена, чтобы иметь то, что является этим выражением.Хотя он в основном используется только для присвоения имен литералам, например, для настройки конфигурации базы данных, это не обязательно.Вы можете поместить туда динамическое выражение, например

define("DB_USER", $hostname == "dev" ? "devuser" : "produser");
0 голосов
/ 02 мая 2019

Это действительный PHP, но он НЕ совпадает с вызовом функции каждый раз (если только функция не всегда возвращает один и тот же результат). В основном функция вызывается, когда встречается define, и это возвращаемое значение присваивается константе. Рассмотрим:

function getv() {
    static $v = 4;
    return $v++;
}

define('V', getv());
echo V . PHP_EOL;
echo getv() . PHP_EOL;
echo V . PHP_EOL;

Выход:

4
5
4

Обратите внимание, что константа V всегда выдает 4, даже после того, как возвращаемое значение getv изменится на 5.

Демонстрация на 3v4l.org

...