Php имя константы переменной

PHP
Константы

Константы используются для хранения значений, которые не должны быть изменены позже. Они также часто используются для хранения параметров конфигурации, особенно тех, которые определяют среду (dev / production).

Константы имеют такие типы, как переменные, но не все типы могут использоваться для инициализации константы. Объекты и ресурсы не могут использоваться как значения для констант вообще. Массивы могут использоваться как константы, начиная с PHP 5.6

Некоторые постоянные имена зарезервированы PHP. К ним относятся true , false , null а также многие константы, специфичные для модуля.

Константы обычно называются с использованием прописных букв.

Проверка константы

Простая проверка

Чтобы проверить, определена ли константа, используйте defined функцию. Обратите внимание, что эта функция не заботится о значении константы, она заботится только о том, существует ли константа или нет. Даже если значение константы равно null или false функция все равно вернет true .

Обратите внимание, что константа становится «видимой» в вашем коде только после строки, в которой вы ее определили:

 define("GOOD", false); if (defined("GOOD")) < print "GOOD is defined"; // prints "GOOD is defined" >

Получение всех определенных констант

Чтобы получить все определенные константы, в том числе созданные PHP, используйте функцию get_defined_constants :

Чтобы получить только те константы, которые были определены вашим приложением, вызовите функцию в начале и в конце вашего скрипта (обычно после процесса начальной загрузки):

Читайте также:  Php fatal error cannot make static method non static

Иногда это полезно для отладки

Определение констант

Константы создаются с помощью инструкции const или функции define . Соглашением является использование букв UPPERCASE для постоянных имен.

Определить константу с использованием явных значений

const PI = 3.14; // float define("EARTH_IS_FLAT", false); // boolean const "UNKNOWN" = null; // null define("APP_ENV", "dev"); // string const MAX_SESSION_TIME = 60 * 60; // integer, using (scalar) expressions is ok const APP_LANGUAGES = ["de", "en"]; // arrays define("BETTER_APP_LANGUAGES", ["lu", "de"]); // arrays 

Определить константу с использованием другой константы

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

const TAU = PI * 2; define("EARTH_IS_ROUND", !EARTH_IS_FLAT); define("MORE_UNKNOWN", UNKNOWN); define("APP_ENV_UPPERCASE", strtoupper(APP_ENV)); // string manipulation is ok too // the above example (a function call) does not work with const: // const TIME = time(); # fails with a fatal error! Not a constant scalar expression define("MAX_SESSION_TIME_IN_MINUTES", MAX_SESSION_TIME / 60); const APP_FUTURE_LANGUAGES = [-1 => "es"] + APP_LANGUAGES; // array manipulations define("APP_BETTER_FUTURE_LANGUAGES", array_merge(["fr"], APP_BETTER_LANGUAGES)); 

Зарезервированные константы

Некоторые константные имена зарезервированы PHP и не могут быть переопределены. Все эти примеры потерпят неудачу:

define("true", false); // internal constant define("false", true); // internal constant define("CURLOPT_AUTOREFERER", "something"); // will fail if curl extension is loaded 
Constant . already defined in . 

Условные определения

Если у вас есть несколько файлов, где вы можете определить одну и ту же переменную (например, вашу основную конфигурацию, а затем локальную конфигурацию), следующий синтаксис может помочь избежать конфликтов:

defined("PI") || define("PI", 3.1415); // "define PI if it's not yet defined" 

const vs define

define — это выражение времени выполнения, а const — время компиляции.

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

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

const поддерживает только другие константы и скаляры как значения, а не операции.

Константы классов

Константы могут быть определены внутри классов с использованием ключевого слова const .

class Foo < const BAR_TYPE = "bar"; // reference from inside the class using self:: public function myMethod() < return self::BAR_TYPE; >> // reference from outside the class using :: echo Foo::BAR_TYPE; 

Это полезно для хранения типов предметов.

 > $logger = new Logger(); $logger->log("Info"); // Using default value $logger->log("Warning", $logger::LEVEL_WARNING); // Using var $logger->log("Error", Logger::LEVEL_ERROR); // using class 

Постоянные массивы

Массивы могут использоваться как простые константы и константы класса из версии PHP 5.6 и далее:

Пример константы класса

class Answer < const C = [2,4]; >print Answer::C[1] . Answer::C[0]; // 42 

Пример простой константы

const ANSWER = [2,4]; print ANSWER[1] . ANSWER[0]; // 42 

Также из версии PHP 7.0 эта функция была перенесена на функцию define для простых констант.

define('VALUES', [2, 3]); define('MY_ARRAY', [ 1, VALUES, ]); print MY_ARRAY[1][1]; // 3 

Использование констант

Чтобы использовать константу, просто используйте ее имя:

if (EARTH_IS_FLAT) < print "Earth is flat"; >print APP_ENV_UPPERCASE; 

или если вы заранее не знаете имя константы, используйте constant функцию:

// this code is equivalent to the above code $const1 = "EARTH_IS_FLAT"; $const2 = "APP_ENV_UPPERCASE"; if (constant($const1)) < print "Earth is flat"; >print constant($const2); 
  • Начало работы с PHP
  • APCu
  • BC Math (бинарный калькулятор)
  • Imagick
  • IMAP
  • JSON
  • Loops
  • PDO
  • PHP MySQLi
  • php mysqli affected rows возвращает 0, когда он должен возвращать положительное целое число
  • PHP Встроенный сервер
  • PHPDoc
  • PSR
  • SimpleXML
  • SQLite3
  • Streams
  • URL-адрес
  • UTF-8,
  • WebSockets
  • XML
  • YAML в PHP
  • Автозагрузка грунтовки
  • Альтернативный синтаксис для структур управления
  • Анализ HTML
  • Асинхронное программирование
  • Аутентификация HTTP
  • Безопасность
  • Буферизация вывода
  • Вклад в PHP Core
  • Внедрение зависимости
  • Внесение изменений в Руководство по PHP
  • Волшебные константы
  • Волшебные методы
  • Вывод значения переменной
  • Выполнение по массиву
  • Генераторы
  • закрытие
  • Защитите Remeber Me
  • Интерфейс командной строки (CLI)
  • Использование cURL в PHP
  • Использование MongoDB
  • Использование Redis с PHP
  • Использование SQLSRV
  • Итерация массива
  • Как определить IP-адрес клиента
  • Как разбить URL-адрес
  • Класс Datetime
  • Классы и объекты
  • Клиент SOAP
  • Комментарии
  • Компилировать расширения PHP
  • Компиляция ошибок и предупреждений
  • Константы
  • Контрольные структуры
  • криптография
  • кэш
  • локализация
  • Манипулирование массивом
  • Манипуляции заголовков
  • Массивы
  • Машинное обучение
  • Менеджер зависимостей композитора
  • Многопоточное расширение
  • многопроцессорная обработка
  • Монго-PHP
  • Область переменных
  • Обработка изображений с помощью GD
  • Обработка исключений и отчетов об ошибках
  • Обработка нескольких массивов вместе
  • Обработка файлов
  • Общие ошибки
  • операторы
  • отладка
  • Отправка электронной почты
  • отражение
  • переменные
  • Переменные Superglobal PHP
  • Печенье
  • Поддержка Unicode в PHP
  • Пространства имен
  • Работа с датами и временем
  • Развертывание докеров
  • Регулярные выражения (regexp / PCRE)
  • Рекомендации
  • Рецепты
  • Розетки
  • Сервер SOAP
  • Сериализация
  • Сериализация объектов
  • сессии
  • Соглашения о кодировании
  • Создание PDF-файлов в PHP
  • Спектакль
  • Строковый анализ
  • Структуры данных SPL
  • Тестирование устройства
  • Тип жонглирования и нерегулярные проблемы сравнения
  • Тип подсказки
  • Типы
  • Установка в средах Linux / Unix
  • Установка среды PHP в Windows
  • Фильтры и функции фильтра
  • Форматирование строк
  • функции
  • Функции хеширования пароля
  • Функциональное программирование
  • Черты
  • Чтение данных запроса
  • Шаблоны проектирования

Источник

[PHP] Как передать название константы переменную?

Здравствуйте. Есть класс Error и метод display(), который получает в себя код ошибки (1 — фатальная, 2 — критическая, 3 — пользовательская, 4 — предупреждение) и если ошибка не фатальная, он вызывает статический метод внутри класса, который загружает константы описания ошибок из json файла. Так, же, метод display получает вторую переменную, которая как раз содержит константу описания этой ошибки. Когда языковые константы ошибок определены, метод display в зависимости от кода, должен вывести значение этой константы. Например, Мы получили ошибку подключения к базе MySQL. Метод подключения тут же, запрашивает Error:display(2, MYSQL_ERROR). Метод парсинга языка, определяет константу LANG_MYSQL_ERROR и display выводит ее. Например, «Неизвестная ошибка подключения к базе данных». Проблема в том, что когда я передаю название константы, я передаю ее как переменную. Как передать название константы в метод не как переменную или как хотя бы заставить ее интерпретировать при выводе не как (string) var, а как константу? Набросок кода ниже. Убрал лишнее, чтобы проблему было видно.

if (!defined('PARENT')) 
die("Fatal error");

class Error



//Метод завантаження назв помилок в константи
static function get_language() $files = new Files;
if ($lang = Headers::get_language())
$files->ParseJSON(LANGS_DIR.$lang.'/errors.json', 'LANG');
else if (defined(CONF_DEFAULT_LANG)) $files->ParseJSON(LANGS_DIR.CONF_DEFAULT_LANG.'/errors.json', 'LANG');
else $files->ParseJSON(LANGS_DIR.'english/errors.json', 'LANG');
>
>




function display($code = null, $type = 2) self::get_language();
switch ($type) //Фатальна помилка
//Не виконується перевірка мовних констант
case 1:
die($code);
break;
//Критична помилка
case 2:
die($code);
break;
//Помилка
case 3:
echo $code;
break;
//Попередження
case 4:
echo $code;
break;
>
>
>

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

А чем переменная не устраивает? Не вижу здесь вообще никакого смысла использовать константы. Они для того и константы, что их значения подразумевается что будет константным.

siv1987, так у меня настройки и не должны меняться, а главное, должны быть кругом доступные. У глобального супермассива синтаксис неудобный, поэтому, конфиги и ленгы константами. Меня интересует вопрос производительности и как заставить интерпретироваться константу. Например, я передаю ее название в переменной $a. выведет CONST. Как заставить выводить br. Какое-то там (const) как в C есть. ?>

siv1987, а смысл в том, что я изначально не знаю, какую константу мне надо вывести. Ее имя принимает метод из других классов и выводит ее. Вот как раз мне нужно, чтобы имя константы передавалось переменной? Смысл это уже мое дело. Стиль такой, что конфигурация и языковые константы должны быть константами и должны задаваться из файла json. Т.е., загрузились и усе. И дальше только для чтения и никто не может изменить ее значение. Т.е., никакие $conf[‘db_name’] = false уже не сработают, потому что будет CONF_DB_NAME. Ну вот представьте, загружу я конфиги в массив, буду каждом файле задавать их глобальными, обращаться к ним фиг каким именем, а тут CONF_DB_NAME и все. Но вот только значение этого, скажем, DB_NAME неизвестно, т.е. вывод констант динамический, хоть и константа статическая. Константу мы не трогаем, просто выводим в зависимости от ситуации. Ну не писать же мне для каждой константы switch.

Это сработает если константы уже заданы. Мне не надо передавать значение, потому что изначально константы для названия ошибок не загружаются. Надо передать только ее имя. А значение задается в самом методе. Т.е., зачем мне загружать константы ошибок, если не факт, что эта ошибка будет. Нужно по факту.

Пришлось, тело метода загрузки констант поместить в __construct. Так, при обращении к Error::display(название константы), константы уже автоматически загружены и интерпретируются прямо при запросе. Но все-равно, костыли это.

Источник

Оцените статью