Переопределение константы php. Волшебные константы
Читайте также
» Константы в PHP?
Употребляя в повседневной жизни слово «константа», мы имеем в виду постоянное значение. Это может быть число Пи (3,14) или температура кипения воды (100 °С). В РНР тоже имеется возможность использовать константы. Смысл их применения заключается в том, что обозначив определенное значение, мы можем использовать его на протяжении всего кода программы.
(!) Константа - это неизменяемое значение.
Например, ваш друг Василий Пупкин создал Web-сайт и хочет, чтобы все знали имя администратора. При этом он находит самое простое и, на первый взгляд, верное решение (листинг 4.19).
Листинг 4.19. Вывод фамилии и имени администратора Web-сайта.
‹?php
echo "Администратор сайта: Пупкин Василий"; // вывод сообщения
?›
Соответственно, надо изменить имя администратора. Скорее всего, вы станете искать по всем страницам сайта текст, содержащий строчку Пупкин Василий. После нахождения надо разобраться, менять ли ее на ваше имя или нет. Не трудно заметить, что решение, на первый взгляд, простой задачи занимает много времени и не гарантирует корректную работу программы. Все эти проблемы можно было бы избежать, если бы Василий применил константу для обозначения своего имени. Для этого надо выбрать имя константы (обычно его называют идентификатором), например ADMIN_NAME, после чего определить ее значение (в нашем случае Пупкин Василий).
Теперь решение задачи будет выглядеть так, как показано в листинге 4.20.
Листинг 4.20. Пример использования констант.
‹html›
‹head›
‹title›Пример использования констант‹/title›
‹/head›
‹body›
‹?php
define("ADMIN_NAME", "Пупкин Василий"); // определение константы
echo "Администратор сайта: "; // вывод сообщения
echo ADMIN_NAME; // вывод значения константы
?›
‹/body›
‹/html›
В этом случае идентификатор ADMIN_NAME будет заменен значением Пупкин Василий. Для того чтобы изменить имя администратора Web-сайта, потребуется только корректировка строчки с определением константы. Рассмотрим эту тему более подробно.
В этой заметке речь пойдет о константах. Как обычно разберемся с самим понятием константы в языках программирования и посмотрим, как объявляются и используются константы в PHP .
Понятие константа и константы в PHP
Слово константа должно быть вам уже знакомо из математики:
“Математическая константа - величина, значение которой не меняется.”
Тоже самое и в PHP. Константа в PHP – это идентификатор, который служит для обозначения простого значения (строка, число какое-нибудь), которое не может изменяться в процессе выполнения кода.
Для объявления константы (присвоения ей значения) используется функция define . Пример объявления константы:
Имена констант в PHP чувствительны к регистру (большие и маленькие буквы различаются), так что нужно быть внимательней. Также существует соглашение, что имена констант всегда пишутся в верхнем регистре.
Имя константы должно начинаться с буквы или символа подчеркивания “_” и может состоять из букв, цифр и подчеркивания.
Рассмотрим простой пример использования константы:
В этом примере мы объявили константу и использовали ее в программе.
Для чего используются константы и не проще ли использовать переменные?
Как уже было сказано, константы не могут изменить своего значения в процессе выполнения программы. В константах обычно сохраняют постоянные параметры сайта, такие как реквизиты доступа к базе данных (хост, логин и пароль пользователя, имя базы данных), расположение сайта на диске и многие другие настройки.
Если мы будем использовать переменные, то скрип может случайно (в случаем ошибки) изменить значение переменной и будет работать не так как вы задумали.
Использование констант гарантирует, что то значение которое вы указали при объявлении константы останется неизменным.
Для каждого выполняемого скрипта. Многие из этих констант определяются различными модулями и будут присутствовать только в том случае, если эти модули доступны в результате динамической загрузки или в результате статической сборки.
Есть девять магических констант, которые меняют свое значение в зависимости от контекста, в котором они используются. Например, значение __LINE__ зависит от строки в скрипте, на которой эта константа указана. Все магические константы разрешаются во время компиляции, в отличие от обычных констант, которые разрешаются во время выполнения. Специальные константы нечувствительны к регистру и их список приведен ниже:
Имя | Описание |
---|---|
__LINE__ | Текущий номер строки в файле. |
__FILE__ | Полный путь и имя текущего файла с развернутыми симлинками. Если используется внутри подключаемого файла, то возвращается имя данного файла. |
__DIR__ | Директория файла. Если используется внутри подключаемого файла, то возвращается директория этого файла. Это эквивалентно вызову dirname(__FILE__) . Возвращаемое имя директории не оканчивается на слеш, за исключением корневой директории. |
__FUNCTION__ | Имя функции или {closure} в случае анонимной функции. |
__CLASS__ | Имя класса. Это имя содержит название пространства имен, в котором класс был объявлен (например, Foo\Bar ). Обратите внимание, что начиная с PHP 5.4 __CLASS__ также работает в трейтах. При использовании в методах трейтов __CLASS__ является именем класса, в котором эти методы используется. |
__TRAIT__ | Имя трейта. Это имя содержит название пространства имен, в котором трейт был объявлен (например, Foo\Bar ). |
__METHOD__ | Имя метода класса. |
__NAMESPACE__ | Имя текущего пространства имен. |
ClassName::class | Полное имя класса (с указанием пространства имен). См. также ::class . |
Смотрите также get_class() , get_object_vars() , file_exists() и function_exists() .
Список изменений
14 years ago
The difference between
__FUNCTION__ and __METHOD__ as in PHP 5.0.4 is that
FUNCTION__ returns only the name of the function
while as __METHOD__ returns the name of the class alongwith the name of the function
class trick
{
function doit()
{
echo __FUNCTION__;
}
function doitagain()
{
echo __METHOD__;
}
}
$obj=new trick();
$obj->doit();
output will be ---- doit
$obj->doitagain();
output will be ----- trick::doitagain
12 years ago
The __CLASS__ magic constant nicely complements the get_class() function.
Sometimes you need to know both:
- name of the inherited class
- name of the class actually executed
Here"s an example that shows the possible solution:
Class
base_class
{
function
say_a
()
{
"
;
}
Function
say_b
()
{
"
;
}
class
derived_class
extends
base_class
{
function
say_a
()
{
parent
::
say_a
();
echo
""a" - said the "
.
__CLASS__
.
"
"
;
}
Function
say_b
()
{
parent
::
say_b
();
echo
""b" - said the "
.
get_class
($this
) .
"
"
;
}
}
$obj_b = new derived_class ();
$obj_b
->
say_a
();
echo
"
"
;
$obj_b
->
say_b
();
?>
The output should look roughly like this:
"a" - said the base_class
"a" - said the derived_class
"b" - said the derived_class
"b" - said the derived_class
3 years ago
Note a small inconsistency when using __CLASS__ and __METHOD__ in traits (stand php 7.0.4): While __CLASS__ is working as advertized and returns dynamically the name of the class the trait is being used in, __METHOD__ will actually prepend the trait name instead of the class name!
8 years ago
There is no way to implement a backwards compatible __DIR__ in versions prior to 5.3.0.
The only thing that you can do is to perform a recursive search and replace to dirname(__FILE__):
find . -type f -print0 | xargs -0 sed -i "s/__DIR__/dirname(__FILE__)/"
5 years ago
A lot of notes here concern defining the __DIR__ magic constant for PHP versions not supporting the feature. Of course you can define this magic constant for PHP versions not yet having this constant, but it will defeat its purpose as soon as you are using the constant in an included file, which may be in a different directory then the file defining the __DIR__ constant. As such, the constant has lost its *magic*, and would be rather useless unless you assure yourself to have all of your includes in the same directory.
Concluding: eye catchup at gmail dot com"s note regarding whether you can or cannot define magic constants is valid, but stating that defining __DIR__ is not useless, is not!
7 years ago
You cannot check if a magic constant is defined. This means there is no point in checking if __DIR__ is defined then defining it. `defined("__DIR__")` always returns false. Defining __DIR__ will silently fail in PHP 5.3+. This could cause compatibility issues if your script includes other scripts.
echo (defined
("__DIR__"
) ?
"__DIR__ is defined"
:
"__DIR__ is NOT defined"
.
PHP_EOL
);
echo (defined
("__FILE__"
) ?
"__FILE__ is defined"
:
"__FILE__ is NOT defined"
.
PHP_EOL
);
echo (defined
("PHP_VERSION"
) ?
"PHP_VERSION is defined"
:
"PHP_VERSION is NOT defined"
) .
PHP_EOL
;
echo
"PHP Version: "
.
PHP_VERSION
.
PHP_EOL
;
?>
Output:
__DIR__ is NOT defined
__FILE__ is NOT defined
PHP_VERSION is defined
PHP Version: 5.3.6
Привет. Сегодня решил написать о константах в PHP. Расскажу как константы работают, какие чаще всего применяются и бывают.
Что такое константы в контексте PHP?
Константы — это по сути переменные у которых нельзя переопределить значение. Т.е после указания их значения вы больше не сможете его менять по ходу выполнения скрипта. Они как правило пишутся в верхнем регистре и в названии конкретно отражают хранимую в них информацию.
В PHP существует 2 разновидности констант:
- Обычные (задаются программистом)
- Предопределенные (задаются интерпретатором)
Обычные константы
Такой тип констант обычно используются как правило для служебных целей и создаются программистом в процессе написание кода.
Синтаксис создания обычной константы:
Define("PI",3.1415);
Создание константы происходит с помощью встроенной конструкции define ("Имя константы","Значение константы").
Для краткого пояснения механизма работы с константами покажу пример того что значения в константах задается один раз, и более не может быть изменено:
Для того чтобы проверить существование константы в языке предусмотрена функция defined («CONST_NAME»).
Предопределенные константы
Предопределенные константы отличаются от обычных способом создания. Они устанавливаются самим интерпретатором и меняют свое значение в контексте выполнения программы. Так же они не чувствительны к регистру, __CLASS__ или __class__ будут прекрасно выполнены интерпретатором.
Вот самые часто используемые предопределенные константы:
- __FILE__ — хранит имя выполняемого на данный момент скрипта.
- __FUNCTUIN__ — имя текущей функции.
- __CLASS__ — имя текущего класса.
- PHP_VERSION — содержит версию интерпретатора PHP.
- TRUE , FALSE , NULL — содержат в себе значения соответствующие своему названию.
Для примера работы таких констант посмотрим на использование одной из них — __FUNCTION__ :
Как можно видеть из примера константа __function__ вернула имя функции в которой она была первоначально вызвана — abc () .
И да, константу невозможно удалить как обычную переменную функцией unset () , она существует от начала и до конца выполнения программы.
На этом все, желаю успешной практики и хорошего настроения. До скорого.
сайт Права на контент защищены.В 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" . Также его можно вызвать непосредственно, как любой другой публичный метод.