Часто задаваемые вопросы (FAQ): вещи, которые вам необходимо знать о пространствах имен. Стандартные константы PHP Php создание константы
В PHP имеется набор специальных предопределенных констант и магических методов для ваших проектов. В отличие от обычных констант, которые можно устанавливать с помощью define() , значение предопределенных констант зависит от того, где они используются, и является информацией только для чтения о коде и PHP системе. Магические методы можно использовать в ваших классах для получения доступа к специальному функционалу PHP.
В данном уроке мы рассмотрим несколько полезных предопределенных констант и магических методов с примерами использования в коде.
Предопределенные константы
Предопределённые константы используются для получения информации о вашем коде. Имя такой константы пишется заглавными буквами между сдвоенными подчеркиваниями, например, __LINE__ и __FILE__ . Вот несколько полезных предопределённых констант, доступных в PHP:
- __LINE__ возвращает номер строки в исходном файле, где используется константа:
- __FILE__ представляет имя файла, включая полный путь:
- __DIR__ представляет только путь к файлу:
- __CLASS__ представляет имя текущего класса:
- __FUNCTION__ представляет имя текущей функции:
- __METHOD__ представляет имя текущего метода:
- __NAMESPACE__ представляет имя текущего пространства имен:
Магические методы
Магические методы представляют крючки для специального функционала PHP. Их имена пишутся маленькими буквами с двумя предшествующими подчеркиваниями, например, __construct() и __destruct() .
Construct() - магический метод, который PHP вызывает для создания экземпляра вашего класса. Он принимает любое количество аргументов.
Destruct()- магический метод, который вызывается, когда объект уничтожается коллектором PHP. Данный метод не принимает аргументов и обычно используется для выполнения специальных операций, например, для закрытия соединения с базой данных.
Следующие несколько магических методов предназначены для манипуляций со свойствами, и представляют способ для PHP обработать обращения ко свойствам и методам, которые не были определены (или недоступны).
PHP вызывает метод __get() в получающем контексте, если свойство не определено (или недоступно). Метод принимает один аргумент - имя свойства. Он должен вернуть значение, которое будет обрабатываться как значение свойства.
Метод __set() вызывается для неопределенного свойства в задающем контексте. Данный метод принимает два аргумента, имя свойства и значение.
myAarray[$prop] = $value; } public function __get($prop) { return $this->myArray[$prop]; } public function __isset($prop) { return isset($this->myArray[$prop]); } public function __unset($prop) { unset($this->myArray[$prop]); } public function __toString() { return __CLASS__ . ":" . $this->name; } } $obj = new MySample(); if (!isset($obj->name)) { $obj->name = "Alireza"; } echo $obj->name; // Alireza echo $obj; // MySample:Alireza
В выше приведенном коде свойство name не определено в классе. В коде предпринимается попытка назначить данному свойству значение “Alireza” и PHP вызывает магический метод __set() . Он получает “name” в качестве аргумента $prop и “Alireza” как $value , и сохраняет значение в частном массиве $myArray . Метод __get() работает в схожей манере. При выводе $obj->name вызывается метод __get() и ему передается значение “name” как аргумент $prop .
Есть и другие магические методы, которые помогают манипулировать недоступными свойствами, как в приведенном примере: __isset() , __unset() и __toString() . Оба метода __isset() и __unset() запускаются функциями с такими же именами, но без подчеркиваний в PHP.
Isset() проверяет, установлено свойство или нет. Данный метод принимает один аргумент - свойство, которое надо проверить. Метод __unset() принимает один аргумент, имя свойства, которое нужно сбросить.
Во многих случаях удобно представление объекта как строки, например, для вывода пользователю или другому процессу. Обычно PHP представляет объект как идентификатор в памяти, что плохо для таких функций. Метод __toString() помогает представить объект как строку. Метод запускается во многих ситуациях, где объект используется как строка, например, echo "Hello $obj" . Также его можно вызвать непосредственно, как любой другой публичный метод.
Последнее обновление: 1.11.2015
Константы, как и переменные хранят определенное значение, только в отличие от переменных значение констант может быть установлено только один раз, и далее мы уже не можем его изменить. Например, определим числовую константу:
Для определения константы используется оператор define , который имеет следующую форму: define(string $name, string $value, bool $case_sen=false) . Параметр $name передает название константы, а параметр $value - ее значение. Третий необязательный параметр принимает логическое значение true или false . Если значение равно false, то при использовании константы будет учитываться ее регистр, если true - регистр не учитывается. В нашем случае третий параметр не использован, поэтому он по умолчанию равен false.
После определения константы мы можем ее использовать также, как и обычную переменную. Единственное исключение - мы не сможем изменить ее значение. Другое отличие от переменной - не надо использовать знак $ . То есть выражение NUMBER=33; работать не будет.
Предопределенные константы
Кроме создаваемых программистом констант в PHP имеется еще несколько встроенных констант:
FILE__ : хранит полный путь и имя текущего файла
LINE__ : хранит текущий номер строки, которую обрабатывает интерпретатор
DIR__ : хранит каталог текущего файла
FUNCTION__ : название обрабатываемой функции
CLASS__ : название текущего класса
METHOD__ : название обрабатываемого метода
NAMESPACE__ : название текущего пространства имен
Например, выведем текущую выполняемую строку и название файла:
Проверка существования константы
Чтобы проверить, определена ли константы, мы можем использовать функцию bool defined(string $name) . Если константа $name определена, то функция будет возвращать значение true
Проверка существования констант
Константы в PHP
Константой называется именованная величина, которая не изменяется в процессе выполнения программы.
В отличие от переменной, вы не можете изменить значение константы, которое было ей присвоено при её объявлении. Константы удобно использовать для хранения значений, которые не должны изменяться во время работы программы. Константы могут содержать только скалярные данные (логического, целого, плавающего и строкового типов).
В РНР константы определяются функцией define() . Эта функция имеет следующий формат:
define ($name , $value , $case_sen ), где:
$name
- имя константы;
$value
- значение константы;
$case_sen
- необязательный параметр логического типа,
указывающий, следует ли учитывать регистр букв (true) или нет (false).
Пример определения и использования констант в PHP:
define("pi",3.14,true);
echo pi;
// Выводит 3.14
?>
Если параметр $case_sen равен true , то интерпретатор будет учитывать регистр символов при работе с константой. Обратите внимание, что константы используются без предваряющего знака $ .
Различия между константами и переменными:
· У констант нет приставки в виде знака доллара ($ );
· Константы можно определить только с помощью функции define() , а не присваиванием значения;
· Константы могут быть определены и доступны в любом месте без учета области видимости;
· Константы не могут быть определены или аннулированы после первоначального объявления; и
· Константы могут иметь только скалярные значения.
Для проверки существования константы можно использовать функцию defined() . Данная функция возвращает true , если константа объявлена. Приведем пример:
// Объявляем константу pi
define("pi",3.14,true);
if (defined("pi")==true) echo "Константа pi объявлена!";
// Скрипт выведет "Константа pi объявлена!"
?>
В PHP существуют следующие предопределенные константы:
PHP предоставляет большой список предопределенных констант для каждого выполняемого скрипта. Многие из этих констант определяются различными модулями и будут присутствовать только в том случае, если эти модули доступны в результате динамической загрузки или в результате статической сборки.
Есть пять предопределенных констант, которые меняют свое значение в зависимости от контекста, в котором они используются. Например, константа __LINE__ зависит от строки в скрипте, на которой эта константа указана. Специальные константы нечувствительны к регистру и их список приведен ниже.
Константы - это значения, которые не изменяются со временем. Ещё из школы Вы, наверняка, знаете многие константы, например, число п , число e , ускорение свободного падения и другие. И, разумеется, при программировании тоже очень часто возникает необходимость ввода констант . И о том, как создавать и использовать константы в PHP , мы и поговорим в этой статье.
Давайте с Вами создадим константу числа п :
define(PI, 3.1415926);
echo PI;
?>
Оператор define создаёт константу PI и присваивает ей значение 3.1415926 . Дальше мы выводим эту константу через оператор echo . Всё очень просто, однако, есть одна рекомендация, которую я советую Вам всегда соблюдать. Обязательно пишите константы заглавными буквами. Не то, чтобы это было обязательно, но крайне желательно. И так принято не только в PHP , но и в других языках тоже.
Разумеется, впоследствии изменить константу PI будет нельзя (на то она и константа ).
Теперь разберём одну функцию, которая проверяет: "Определена ли заданная константа ". Давайте напишем такой скрипт:
if (!defined("PI")) define(PI, 3.1415926);
echo PI;
?>
Здесь проверяется существование константы PI . И если она не существует (то есть функция define() вернула false ), то тогда инициализируем эту константу. Затем просто выводим её.
Как видите, создавать и использовать свои константы в PHP - это очень просто.
И, напоследок, хочется рассказать об уже встроенных константах PHP . Давайте с Вами напишем простой скрипт:
phpinfo();
?>
Ближе к концу есть раздел "PHP Variable ". Собственно, это не совсем константы , однако, они являются константами при выполнении данного скрипта. Разумеется, при выполнении другого скрипта они уже будут иметь другие значения (не все, разумеется). Давайте с Вами выведем пару констант , чтобы Вы поняли, как с ними работать, ведь они используются безумно часто:
echo $_SERVER["REMOTE_ADDR"];
echo "
";
echo $_SERVER["QUERY_STRING"];
?>
В данном скрипте мы выводим IP-адрес пользователя , запустившего скрипт, а на следующей строке выводим строку запроса (например, "index.php?id=7 "). Забегая немного вперёд, говорю, что здесь мы работаем с глобальным массивом $_SERVER . С массивами мы ещё познакомимся, но, думаю, что те, кто работал с массивами в других языках программирования, без проблем узнают синтаксис. Что же касается других констант , то с ними работа происходит аналогично.
В этой заметке разберемся, в чем разница в объявлении PHP констант с помощью ключевого слова const и функции define() .
Константы в PHP - это «постоянные», значения которых указывается всего один раз и затем не может быть изменено. При попытке изменить значение, оно не изменится и появится PHP заметка: «Constant already defined» (константа уже определена):
Define("FOO", "val"); define("FOO", "val2"); // Notice: Constant already defined echo FOO; //> val
Объявлять константы в PHP можно двумя способами:
// 1 define("NAME", "VALUE"); // 2 const NAME = "VALUE";
У каждого способа есть свои особенности, чтобы их понять, давайте рассмотрим все поэтапно, как и что менялось с каждой версией PHP.
Как создавать константы
PHP меньше 5.3
До 5.3 в PHP, константы можно было определять только через define() . Ключевое слово const появилось с версии 5.3.
Константы могут хранить только скаляры . Скалярные переменные - это переменные с типами integer , float , string и boolean . Типы array , object и resource не являются скалярными.
// скаляры define("FOO", 10); define("FOO", 10.9); define("FOO", "val"); define("FOO", true); // не скаляры define("FOO", array(1)); // константа не установиться и получим Warning define("FOO", (object) array(1)); // константа не установиться и получим Warning
С версии PHP 5.3
Появилось ключевое слово const и теперь константу можно определять еще и с помощью него.
Однако, в const нельзя указать переменную, функцию или какое то выражение, а нужно передавать скаляр «напрямую»:
Const FOO = "val"; // нет ошибок const FOO = $var; // Parse error const FOO = home_url(); // Parse error const FOO = 5 + 10; // Parse error const FOO = "foo"."bar"; // Parse error
Тогда как для define() таких ограничений нет...
Define("FOO", "val"); // нет ошибок define("FOO", $var); // нет ошибок define("FOO", home_url()); // нет ошибок define("FOO", 5 + 10); // нет ошибок define("FOO", "foo"."bar"); // нет ошибок
PHP 5.6
Стало возможным указывать в значения const примитивные PHP выражения (выражения из скаляров):
Const FOO = 1 + 2; const FOO = "foo" . "bar";
Стало возможным хранить массивы в константах:
Const FOO = ; // работает define("FOO", ); // не работает PHP 5.6, работает в PHP 7.0
Разница между define() и const
#1 const должны быть объявлены в верхней области
В отличие define() , const должны быть объявлены в самой верхней области видимости, потому что они определяются при компилировании скрипта. Это значит, что их нельзя объявлять внутри функций/циклов/выражений if или try/catch блоков.
If (1) { const NAME = "VALUE"; // не работает } // но if (1) { define("NAME", "VALUE"); // работает }
#2 const всегда регистрозависима
const всегда регистро-зависима, в то время как define() позволяет сделать регистро-независимые константы:
Define("NAME", "VALUE", true); echo NAME; // VALUE echo name; // VALUE
#3 const понимает только скаляры
Это справедливо только для версий PHP 5.6 и ниже...
const нельзя передать переменные, функции, выражения, а define() можно:
Const FOO = $var; // Parse error const FOO = home_url(); // Parse error define("FOO", $var); // нет ошибок define("FOO", home_url()); // нет ошибок
#4 const может хранить массивы с версии PHP 5.6 а define с PHP 7.0
const FOO = ; // работает в PHP 5.6 define("FOO", ); // не работает PHP 5.6, работает в PHP 7.0Итоги сравнения
Определять константу почти всегда лучше с помощью define() , потому что тут больше возможностей и меньше вариантов «поймать» ошибку... Исключение - это когда у вас версия PHP 5.6 и вам нужно сохранить массив в константу, тут поможет const .
Константы PHP класса
Объявляются только с помощью const . Правила для них такие как описано выше: принимают только скаляры, не понимают PHP переменные, функции, выражения...
Постоянные класса всегда общедоступны - нет статуса private или protected .
Объявленная константа принадлежит именно классу, она не принадлежит ни одному объекту и является общей на все объекты (экземпляры) класса.
Class My_Class { const NAME = "VALUE"; // начиная с PHP 5.6 можно использовать математические выражения const SEC_PER_DAY = 60 * 60 * 24; function print_name() { // обращение к константе класса внутри метода через self (сам класс) echo self::NAME; } } // обращение к константе вне класса // можно вызывать из глобальной области видимости без инициализации экземпляра класса echo My_Class::NAME;
Константы для классов очень похожи на статические (static) свойства класса.
Class My_Class { const NAME = "VALUE"; static $name = "VALUE";; } echo My_Class::NAME; echo My_Class::$name;
«Волшебные» константы
И в заключении вспомним про особые константы PHP...
В PHP есть девять волшебных констант, которые меняют свое значение в зависимости от контекста, в котором они используются. Например, значение __LINE__ зависит от строки в скрипте, на которой эта константа указана. Все "волшебные" константы разрешаются во время компиляции, в отличии от обычных констант, которые разрешаются во время исполнения. Специальные константы нечувствительны к регистру и их список приведен ниже:
Константа | Описание |
---|---|
__LINE__ | Текущий номер строки в файле. |
__FILE__ | Полный путь и имя текущего файла, в котором вызывается константа. |
__DIR__ | PHP 5.3.0. Директория файла, в котором используется константа. То же самое что dirname(__FILE__) . Не имеет слэша в конце, кроме корневой директории. |
__FUNCTION__ | Имя функции. |
__CLASS__ | Имя класса. Это имя содержит название пространства имен, в котором класс был объявлен (например, Foo\Bar). Также работает в трейтах. При использовании в методах трейтов является именем класса, в котором эти методы используется. |
__TRAIT__ | PHP 5.4.0. Имя трейта. Это имя содержит название пространства имен, в котором трейт был объявлен (например, Foo\Bar). |
__METHOD__ | Имя метода класса. |
__NAMESPACE__ | PHP 5.3.0. Имя текущего пространства имен. |
ClassName::class | PHP 5.5.0. Полное имя класса (с указанием пространства имен). Также смотрите::class. |