» Константы в 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-сайта, потребуется только корректировка строчки с определением константы. Рассмотрим эту тему более подробно.
константы .Константам можно присваивать следующие типы данных.
Целые – целые числа или числа без десятичной точки (1, 999, 325812841).
Числа с плавающей точкой - числа, содержащие десятичную точку (1.11, 2.5, .44).
Строки – текстовая или числовая информация . Строковые данные всегда заключаются в кавычки ("Hello World", "478-477-5555").
Имена констант PHP в отличие от переменных не начинаются со знака "$". Имена констант обычно записывают в верхнем регистре. Имена констант могут содержать буквы, цифры и символ подчеркивания (_ ); они не могут, однако, начинаться с цифры. Объявление констант показано ниже.
define("STRING_CONSTANT", "This is my string."); define("NUMERIC_CONSTANT", 5);
Следующий фрагмент кода демонстрирует объявление константы, присваивание константе значения и вывод результатов в окне браузера.
Пример 3.2.
My PHP program 500 2.25
В этом примере объявляются значения трех констант: STRING_CONST , INTEGER_CONST и FLOAT_CONST . Затем используется оператор echo для вывода содержимого констант в окне браузера. Кроме вывода в окне браузера, константы можно использовать при выполнении математических и строковых операций PHP.
Операторы применяются для выполнения операций или действий с переменными. Они могут включать присваивание значения переменной, выполнение сложения переменных, сравнение значений переменных и определение состояния условия.
Арифметические операторы
Операторы присваивания
Операторы сравнения
Логические операторы
Арифметические операторы используются для выполнения основных математических операций. В следующей таблице представлены арифметические операторы , которые применяются в PHP .
Пример 3.3.
The sum is 11 The difference is 9 The product is 27 The quotient is 343
Когда вычисляется арифметическое выражение, существует заданный порядок, в котором выполняются операции. Этот порядок называется приоритетом операций. Умножение и деление имеют преимущество (и выполняются первыми) перед сложением и вычитанием, при движении в выражении слева направо. Этот порядок имеет важное влияние на то, будут ли получены ожидаемые результаты. Рассмотрим следующие объявления и присваивания.
Получающееся значение будет равно 18. Сначала $num1 умножается на $num2 , чтобы получить 20; затем $num3 вычитается из 20, чтобы получить 18. Предположим, однако, что в действительности надо сначала вычесть $num3 из $num2 , а затем умножить на $num1 , чтобы получить 12. Показанное выше выражение не создаст этот результат, потому что умножение имеет приоритет перед вычитанием и выполнится первым.
Поэтому часто необходимо переопределить порядок выполнения операций и явно управлять порядком вычисления выражения. Для этого используют скобки (), которые могут помочь изменить порядок выполнения арифметических операций. Приведенный выше пример можно переписать следующим образом.
В этот раз $answer равно 12. $num3 вычитается из $num2 , чтобы получить 3. Затем 3 умножается на $num1 .
Операторы присваивания используются для изменения значения текущей переменной на значение справа от оператора. В следующей таблице представлены операторы присваивания языка PHP.
Оператор | Описание |
---|---|
= | Переменной слева присваивается вычисленное справа значение |
+= | Складывает значение слева со значением справа и присваивает результат переменной слева |
-= | Вычитает значение справа из значения слева и присваивает результат переменной слева |
*= | Умножает значение справа на значения слева и присваивает результат переменной слева |
/= | Делит значение слева на значение справа и присваивает результат переменной слева |
%= | Делит значение слева на значение справа и присваивает остаток (по модулю) переменной слева |
.= | Значение слева соединяется (конкатенация) со значением справа, и результат присваивается переменной слева |
Операторы сравнения используются для сравнения значений. В следующей таблице представлены операторы сравнения языка PHP.
(PHP 5 >= 5.3.0, PHP 7)
Этот список вопросов разделен на две части: общие вопросы и некоторые особенности реализации, которые полезны для более полного понимания.
Сперва, общие вопросы.
Некоторые детали реализации пространств имен, которые полезно понимать.
Нет. Пространства имен не оказывают никакого влияния ни на какой существующий код ни в каком виде или на любой написанный код, который не содержит пространств имен. Вы можете написать такой код, если желаете:
Пример #1 Доступ к глобальным классам вне пространства имен
$a
= new \
stdClass
;
?>
Это функционально эквивалентно следующему:
Пример #2 Доступ к глобальным классам вне пространства имен
$a
= new
stdClass
;
?>
Пример #3 Доступ ко внутренним классам в пространствах имен
namespace
foo
;
$a
= new \
stdClass
;
function test (\ ArrayObject $typehintexample = null ) {}
$a = \ DirectoryIterator :: CURRENT_AS_FILEINFO ;
// расширение внутреннего или глобального класса
class
MyException
extends \
Exception
{}
?>
Пример #4 Доступ ко внутренним классам, функциям или константам в пространствах имен
namespace foo ;
class MyClass {}
// использование класса из текущего пространства имен
function
test
(MyClass $typehintexample
=
null
) {}
// другой способ использовать класс из текущего пространства имен
function
test
(\
foo
\
MyClass $typehintexample
=
null
) {}
// расширение класса из текущего пространства имен
class
Extended
extends
MyClass
{}
// доступ к глобальной функции
$a
= \
globalfunc
();
// доступ к глобальной константе
$b
= \
INI_ALL
;
?>
Имена, которые начинаются с \ всегда преобразуются к тому как они выглядят, т.е. \my\name - это на самом деле my\name , и \Exception - это Exception .
Пример #5 Абсолютные имена
namespace
foo
;
$a
= new \
my
\
name
();
// создает экземпляр класса "my\name"
echo \
strlen
("hi"
);
// вызывает функцию "strlen"
$a
= \
INI_ALL
;
// переменной $a присваивается значение константы "INI_ALL"
?>
Имена, которые содержат обратный слеш, но не начинаются с него, такие как my\name
my другого имени, то этот синоним применяется к my в my\name .
my\name .
Пример #6 Полные имена
namespace
foo
;
use
blah
\
blah
as
foo
;
$a
= new
my
\
name
();
// создает экземпляр класса "foo\my\name"
foo
\
bar
::
name
();
// вызывает статический метод "name" в классе "blah\blah\bar"
my
\
bar
();
// вызывает функцию "foo\my\bar"
$a
=
my
\
BAR
;
// присваивает переменной $a значение константы "foo\my\BAR"
?>
Имена классов, которые не содержат обратный слеш, такие как name могут быть преобразованы двумя различными способами.
Если присутствует импортирующее выражение, которое создает синоним name другого имени, то применяется этот синоним.
В ином случае, текущее имя пространства имен становится префиксом к my\name .
Пример #7 Неполные имена классов
namespace
foo
;
use
blah
\
blah
as
foo
;
$a
= new
name
();
// создает экземпляр класса "foo\name"
foo
::
name
();
// вызывает статический метод "name" в классе "blah\blah"
?>
Имена функций или констант, которые не содержат обратного слеша, такие как name могут быть преобразованы двумя различными способами.
Сперва, текущее имя пространства имен становится префиксом к name .
Затем, если константа или функция name не существует в текущем пространстве имен, используется глобальная константа или функция name , если она существует.
Пример #8 Неполные имена функций или констант
namespace
foo
;
use
blah
\
blah
as
foo
;
const FOO = 1 ;
function
my
() {}
function
foo
() {}
function
sort
(&
$a
)
{
\
sort
($a
);
// вызывает глобальную функцию "sort"
$a
=
array_flip
($a
);
return
$a
;
}
My
();
// вызывает "foo\my"
$a
=
strlen
("hi"
);
// вызывает глобальную функцию "strlen", потому что "foo\strlen" не существует
$arr
= array(1
,
3
,
2
);
$b
=
sort
($arr
);
// вызывает функцию "foo\sort"
$c
=
foo
();
// вызывает функцию "foo\foo" - импорт не применяется
$a
=
FOO
;
// присваивает переменной $a значение константы "foo\FOO" - импорт не применяется
$b
=
INI_ALL
;
// присваивает переменной $b значение глобальной константы "INI_ALL"
?>
Следующие комбинации скриптов допустимы:
namespace
my
\
stuff
;
class
MyClass
{}
?>
namespace
another
;
class
thing
{}
?>
namespace
my
\
stuff
;
include
"file1.php"
;
include
"another.php"
;
$a
= new
MyClass
;
// создает экземпляр класса "thing" из пространства имен "another"
?>
Конфликт имен отсутствует даже несмотря на то, что класс MyClass существует внутри пространства имен my\stuff , потому что определение MyClass находится в отдельном файле. Однако следующий пример приводит к фатальной ошибке с конфликтом имен, потому что класс MyClass определен в том же файле, где находится оператор use.
namespace
my
\
stuff
;
use
another
\
thing
as
MyClass
;
class
MyClass
{}
// фатальная ошибка: MyClass конфликтует с выражением импорта
$a
= new
MyClass
;
?>
PHP не позволяет вложение пространств имен одно в другое
namespace
my
\
stuff
{
namespace
nested
{
class
foo
{}
}
}
?>
Однако, сымитировать вложенные пространства имен так:
namespace
my
\
stuff
\
nested
{
class
foo
{}
}
?>
До PHP 5.6 единственные элементы, которые подвержены действию оператора use - это пространства имен и имена классов. Для сокращения длинных имен констант или функций, заимпортируйте их содержимое в пространство имен.
namespace
mine
;
use
ultra
\
long
\
ns
\
name
;
$a
=
name
\
CONSTANT
;
name
\
func
();
?>
Начиная с PHP 5.6 стало возможным импортирование и создание пседонимов для функций и имен констант.
Очень важно представлять это, потому что обратный слеш используется как экранирующий символ внутри строк. Он всегда должен быть продублирован, когда используется внутри строки, иначе появляется риск возникновения неумышленных последствий:
Пример #9 Подводные камни при использовании имени пространства имен внутри строки с двойными кавычками
$a
=
"dangerous\name"
;
// \n - это переход на новую строку внутри строки с двойными кавычками!
$obj
= new
$a
;
$a
=
"not\at\all\dangerous"
;
// а тут нет проблем.
$obj
= new
$a
;
?>
Внутри строк, заключенных в одинарные кавычки, обратный слеш в качестве разделителя более безопасен, но по-прежнему рекомендуемая практика экранирования обратного слеша во всех строках является наилучшим вариантом.
Любая неопределенная константа, являющаяся неполным именем, как FOO , будет приводить к выводу сообщения о том, что PHP предположил, что FOO было значение константы. Любая константа, с полным или абсолютным именем, которая содержит символ обратного слеша будет приводить к фатальной ошибке, если не будет найдена.
Пример #10 Неопределенные константы
namespace
bar
;
$a
=
FOO
;
// выводит предупреждение: undefined constants "FOO" assumed "FOO";
$a
= \
FOO
;
// фатальная ошибка: undefined namespace constant FOO
$a
=
Bar
\
FOO
;
// фатальная ошибка: undefined namespace constant bar\Bar\FOO
$a
= \
Bar
\
FOO
;
// фатальная ошибка: undefined namespace constant Bar\FOO
?>
Любая попытка определить константу пространства имен, которая совпадает с названиями специальных встроенных констант, приведет к фатальной ошибке.
Пример #11 Неопределенные константы
namespace
bar
;
const
NULL
=
0
;
// Фатальная ошибка;
const
true
=
"stupid"
;
// также фатальная ошибка;
// и т.д.
?>
7 years ago
There is a way to define a namespaced constant that is a special, built-in constant, using define function and setting the third parameter case_insensitive to false:
namespace
foo
;
define
(__NAMESPACE__
.
"\NULL"
,
10
);
// defines the constant NULL in the current namespace
?>
No need to specify the namespace in your call to define(), like it happens usually
namespace
foo
;
define
(INI_ALL
,
"bar"
);
// produces notice - Constant INI_ALL already defined. But:
Define
(__NAMESPACE__
.
"\INI_ALL"
,
"bar"
);
// defines the constant INI_ALL in the current namespace
var_dump
(INI_ALL
);
// will show string(3)"bar". Nothing unespected so far. But:
Define
("NULL"
,
10
);
// defines the constant NULL in the current namespace...
var_dump
(NULL
);
// will show 10
var_dump
(null
);
// will show NULL
?>
If the parameter case_insensitive is set to true
namespace
foo
;
define
(__NAMESPACE__
.
"\NULL"
,
10
,
true
);
// produces notice - Constant null already defined
?>
3 years ago
When creating classes or calling static methods from within namespaces using variables, you need to keep in mind that they require the full namespace in order for the appropriate class to be used; you CANNOT use an alias or short name, even if it is called within the same namespace. Neglecting to take this into account can cause your code to use the wrong class, throw a fatal missing class exception, or throw errors or warnings.
In these cases, you can use the magic constant __NAMESPACE__, or specify the full namespace and class name directly. The function class_exists also requires the full namespace and class name, and can be used to ensure that a fatal error won"t be thrown due to missing classes.
Namespace
Foo
;
class
Bar
{
public static function
test
() {
return
get_called_class
();
}
}
namespace
Foo
\
Foo
;
class
Bar
extends \
Foo
\
Bar
{
}
Var_dump (Bar :: test ()); // string(11) "Foo\Foo\Bar"
$bar
=
"Foo\Bar"
;
var_dump
($bar
::
test
());
// string(7) "Foo\Bar"
$bar
=
__NAMESPACE__
.
"\Bar"
;
var_dump
($bar
::
test
());
// string(11) "Foo\Foo\Bar"
$bar
=
"Bar"
;
var_dump
($bar
::
test
());
// FATAL ERROR: Class "Bar" not found or Incorrect class \Bar used
В этой заметке речь пойдет о константах. Как обычно разберемся с самим понятием константы в языках программирования и посмотрим, как объявляются и используются константы в PHP .
Слово константа должно быть вам уже знакомо из математики:
“Математическая константа - величина, значение которой не меняется.”
Тоже самое и в PHP. Константа в PHP – это идентификатор, который служит для обозначения простого значения (строка, число какое-нибудь), которое не может изменяться в процессе выполнения кода.
Для объявления константы (присвоения ей значения) используется функция define . Пример объявления константы:
Имена констант в PHP чувствительны к регистру (большие и маленькие буквы различаются), так что нужно быть внимательней. Также существует соглашение, что имена констант всегда пишутся в верхнем регистре.
Имя константы должно начинаться с буквы или символа подчеркивания “_” и может состоять из букв, цифр и подчеркивания.
Рассмотрим простой пример использования константы:
В этом примере мы объявили константу и использовали ее в программе.
Как уже было сказано, константы не могут изменить своего значения в процессе выполнения программы. В константах обычно сохраняют постоянные параметры сайта, такие как реквизиты доступа к базе данных (хост, логин и пароль пользователя, имя базы данных), расположение сайта на диске и многие другие настройки.
Если мы будем использовать переменные, то скрип может случайно (в случаем ошибки) изменить значение переменной и будет работать не так как вы задумали.
Использование констант гарантирует, что то значение которое вы указали при объявлении константы останется неизменным.
Последнее обновление: 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