- Константы в PHP — const и define()
- Как создавать константы
- PHP меньше 5.3
- С версии PHP 5.3
- PHP 5.6
- Разница между define() и const
- #1 const должны быть объявлены в верхней области
- #2 const всегда регистрозависима
- #3 const понимает только скаляры, массивы и выражения из примитивов
- #4 const может хранить массивы с версии PHP 5.6, а define с PHP 7.0
- #5 const зависит от пространства имен, а define нет
- Константы PHP класса
- «Волшебные» константы
- How to tell if a PHP constant has been defined already
- Defining a constant with PHP
- Notice error if a constant is defined twice
- Checking to see if a constant has been defined with PHP
- Future posts
- Check Out These Related posts:
- PHP 7 Constants Notice: Constant already defined LESSON 13
- PHP 7 Constants Basic Example
- Notice: Constant already defined
- Case Sensitive Constants in Php7
- PHP 7 Constants Are Global
- Leave a Reply Cancel reply
- Notice: Constant SESS already defined
Константы в PHP — const и define()
В этой заметке разберемся, в чем разница в объявлении PHP констант с помощью ключевого слова const и функции define() . Константы в PHP — это «постоянные», значения которых указывается всего один раз и затем не может быть изменено. При попытке изменить значение, оно не изменится и появится PHP заметка: «Constant already defined» (константа уже определена):
define('FOO', 'val'); define('FOO', 'val2'); // Notice: Constant already defined echo FOO; //> val
// 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 = [1, 2, 3]; // работает define( 'FOO', [1, 2, 3] ); // не работает в PHP 5.6, работает в PHP 7.0
Разница между define() и const
#1 const должны быть объявлены в верхней области
Потому что они определяются при компилировании скрипта. Это значит, что const нельзя использовать внутри функций/циклов/выражений if или try/catch блоков.
#2 const всегда регистрозависима
В то время как define() позволяет создать регистро-независимые константы:
define( 'NAME', 'VALUE', true ); echo NAME; // VALUE echo name; // VALUE
#3 const понимает только скаляры, массивы и выражения из примитивов
const нельзя передать переменные, функции, выражения, а define() можно:
const FOO = $var; // Parse error const FOO = home_url(); // Parse error define( 'FOO', $var ); // нет ошибок define( 'FOO', home_url() ); // нет ошибок
С версии PHP 5.6 в const также можно указывать примитивные выражения и массивы, а не только скаляры.
#4 const может хранить массивы с версии PHP 5.6, а define с PHP 7.0
const FOO = [1, 2, 3]; // работает с PHP 5.6 define( 'FOO', [1, 2, 3] ); // работает с PHP 7.0
#5 const зависит от пространства имен, а define нет
Если мы создаем константу в namespace, то:
- При использовании const — константа будет нахоидтся в этом прастранстве и не будет доступна вне его.
- При использовании define — константа регистрируется как глобальная и будет доступна за пределами namespace.
namespace My\Space; const FOO = 'bar'; define( 'FOOO', 'baz' );
Теперь чтобы обратиться к этим константам за пределами пространства имен, например из другого файла, нужно писать так:
echo \My\Space\FOO; // bar echo FOOO; // baz
Итог сравнения
Определять константу почти всегда лучше с помощью define() , потому что тут больше возможностей и меньше вариантов «поймать» ошибку. Исключения:
- У вас версия PHP 5.6 и вам нужно сохранить массив в константу, тут поможет const .
- Вам нужно, чтобы константа была не в глобальной видимости, а в видимости пространства имен (namespace).
Константы PHP класса
Объявляются только с помощью const . Правила для них такие как описано выше: принимают только скаляры, не понимают PHP переменные, функции, выражения.
Объявленная константа принадлежит классу, она не принадлежит ни одному объекту, но является общей для всех объектов (экземпляров) класса.
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;
До PHP 7.1 постоянные класса всегда общедоступны — нет статуса private или protected . Однако с версии PHP 7.1 константам класса можно указать модификатор:
Константы для классов чем-то похожи на 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. Полное имя класса (с указанием пространства имен). |
До этого из: PHP
How to tell if a PHP constant has been defined already
You can define constants in PHP with the define() function and can check if a constant has already been defined with the defined() function. This post looks at both functions with some examples.
Defining a constant with PHP
Before showing some examples of checking if a constant has been defined with PHP we’ll briefly look at how to define a constant first. This is done with the define() function where the first parameter passed is the name of the constant and the second parameter the value.
The following example sets the constant FOO with the value ‘bar’. Constant names do not have to be uppercase but the naming convention means they usually are:
Note the constant name is enclosed with quotes. Without the quotes you are actually passing a constant to the function instead of the name, and will generate a notice type error mesage if that constant has not already been defined like so:
PHP Notice: Use of undefined constant FOO - assumed 'FOO' in .
If the constant FOO has not already been defined then it will actually define a constant with the name FOO anyway; this is undesirable behaviour and may have unexpected consequences depending if the constant had already been defined or not, so make sure you always use either single quotes or double quotes when defining the name of the constant.
Notice error if a constant is defined twice
If you attempt to define a constant twice in PHP you will get a notice type error message. The following example attempts to define FOO twice:
define('FOO', 'bar'); define('FOO', 'bar');
And you will get an error message like so:
PHP Notice: Constant FOO already defined in .
Checking to see if a constant has been defined with PHP
Checking to see if a function has already been defined in PHP is done using the defined() function which works in a similar way to the define() function. A single parameter is passed in which again needs to be a single or double quoted string.
To test if FOO has been defined and to take appropriate action, you could do something like this:
To do something only if FOO hasn’t been defined you could do this:
And finally, to test to see if the constant FOO has been defined and define it if it hasn’t, do this:
Future posts
In next Monday’s post I’ll look at how to specify a custom error handler for the PHP ADODB Lite database abstraction library. This involves the use of defining appropriate constants and so is a good follow up to this post with a real world example.
Make sure you subscribe to my RSS feed (details below) if you haven’t already so you keep up to date with posts on my blog as they are made.
Check Out These Related posts:
PHP 7 Constants Notice: Constant already defined LESSON 13
PHP 7 Constants are like variables. The only difference is that they cannot be changed. Once you set a “Constant” you cannot change it. PHP Constants need to hold unique information.
PHP 7 Constants Basic Example
In this Php 7 Constants example, we are setting a constant called “WELCOME”. After setting the constant, we then echo it out onto the page. Create another file in your website project called constants.php. Insert the following code between the header and footer includes.
Notice: Constant already defined
If you get, “Notice: Constant already defined” then you are calling in the constant somewhere else on your script. It will look something like this.
Case Sensitive Constants in Php7
If you add the parameter of “true” at the end of a constant then it will make it “case sensitive”. Consider this example. We are using the constant of “ROCKS” and “rocks”. Normally we would not be able to do this but since we used “true” in the second constant we made it case sensitive and can use it.
It will look like this, notice both constants are being called and there are no errors.
PHP 7 Constants Are Global
PHP 7 constants are global, meaning that you can use them site wide. Notice below when we use the function. Inside the function we are just using a constant. The function will then echo out the sentence we coded in the constant.
/* CONSTANTS ARE GLOBAL WHICH MEANS THAT YOU CAN USE THEM THROUGHOUT THE ENTIRE WEBSITE. THE WEBSITES HAVE TO BE TIED TOGETHER WITH "INCLUDES(FILE.PHP)" FOR GLOBALS LIKE THIS TO WORK. IN THE FOLLOWING EXAMPLE NOTICE THAT WE ARE JUST ECHOING OUT THE CONSTANT IN THE FUNCTION. THE FUNCTION WILL THEN PRINT OUT THE STATMENT DEFINED IN THE CONSTANT */ define("PHP7", "I AM A PHP 7 WIZARD"); function wizard() < echo PHP7; >wizard();
PHP 7 Constants Notice: Constant already defined LESSON 13 was last modified: March 17th, 2023 by Maximus Mccullough
Leave a Reply Cancel reply
This site uses Akismet to reduce spam. Learn how your comment data is processed.
Notice: Constant SESS already defined
Notice: Use of undefined constant id — assumed ‘id’
Notice: Use of undefined constant id — assumed ‘id’ in z:homelocalhostwwwfmi_2005cfgmainmenu.php on.
Ошибка Notice: Use of undefined constant
В цикле два раза подряд выполняется следующая функция: function CodeToURLImg($code)
Notice: Use of undefined constant submit — assumed ‘submit’ in
Скажите пожалуйста как сделать вот эту проверку.
Сообщение от Garsio
Expected constant expression; cannot allocate an array of constant size 0
Доброго утра. Народ помогите, вот программа оформлена в виде функции #include <iostream> #include.
Ошибка STOP: 0x0000006F sess-3_initialization_failed
Здрасте,у меня после установки windows xp (оригинал или сборник) ,выскакивает либо сразу либо.
User-defined type not defined. Ругается на объявление корневой процедуры
Привет! Поискал решение, не нашел, давно не обращался за помощью на форум так вот ругается на.
Ошибка `user-defined type not defined`. VBA для OneNote
Используется Win-7; Excel-2016; OneNote-2016. Пробую выполнить пример согласно этой статьи.
‘User — defined type not defined’ при запуске моей процедуры
Здравствуйте, меня зовут Сергей. Я — тот, кого называют чайником в вопросах программирования.
Compile error: User-defined type not defined помогите разобраться
Есть код: Private Sub Поле1_GotFocus() Dim dbs As Database Dim rst As Recordset Dim.