В статье расписал разницу между популярными конструкциями, которые часто используются на PHP.
global и $_GLOBALS
Разница между ключевым словом globalи суперглобальной переменной $_GLOBALSзаключается в следующем.
global— является ключевым словом, а$_GLOBALS— не является, это суперглобальная переменная;globalиспользуется только внутри функций для обращения к глобальным переменным из внешнего контекста функции. Использовать же$_GLOBALSможно, она будет правильно работать.
Общая логика использования global и $_GLOBALS
global:global— это ключевое слово в PHP, которое используется внутри функций для обращения к глобальным переменным из внешнего контекста функции.- Когда вы используете
global $variableName;внутри функции, это означает, что вы хотите использовать глобальную переменную с именем$variableName, определенную во внешней области видимости. - Использование
globalпозволяет изменять значение глобальной переменной изнутри функции.
$_GLOBALS:$_GLOBALSявляется глобальным ассоциативным массивом в PHP, который содержит все глобальные переменные скрипта, доступные из любой области видимости.- Переменные в массиве
$_GLOBALSдоступны из любой части кода без использования ключевого словаglobal. - Чтение и изменение значений переменных в
$_GLOBALSможет быть осуществлено без использования ключевого словаglobal, но это обычно не рекомендуется из-за потенциальных проблем с областью видимости и возможностью переопределения переменных случайно.
Кратко говоря, global используется внутри функций для доступа к глобальным переменным, тогда как массив $_GLOBALS содержит все глобальные переменные и доступен из любой части кода.
Если вы используете ключевое слово global вне функции, прямо в глобальной области скрипта в PHP, скрипт будет выполняться без ошибок, но такое использование global вне функций абсолютно бессмысленно, так как globalпредназначен для работы с глобальными переменными внутри функций. Это не вызовет ошибки, но также не будет иметь эффекта на переменные, потому что они по определению уже являются глобальными в этой области.
Пример использования global в глобальной области, который не приведет к ошибкам, но не имеет смысла:
$globalVar = 'Hello';
global $globalVar;
echo $globalVar; // Выведет: HelloПример правильного использования конструкций в глобальной области видимости:
$_GLOBALS['globalVar'] = 'Hello';
echo $_GLOBALS['globalVar']; // Выведет: HelloСледует избегать избыточного использования ключевого слова global, так как это может усложнить понимание и отладку кода. Использование глобальных переменных не всегда считается хорошей практикой, поскольку они могут сделать ваш код менее модульным и поддерживаемым. Лучше использовать передачу параметров через функции или использовать средства обращения к глобальным переменным в PHP, если это действительно необходимо
const и define()
Ключевое слово const появилось в PHP версии 5.3. До этого константы можно было объявлять только с помощью define(). Но в const нельзя передавать скаляры
Создание констант в PHP version < 5.3
// скаляры
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 version 5.3 — 5.6
Теперь можно указывать в значения const примитивные PHP выражения (выражения, состоящие из скаляров):
const FOO = 1 + 2;
const FOO = 'foo' . 'bar';Также появилась возможность сохранять в константах массивы:
const FOO = [3, 4, 5]; // работает
define( 'FOO', [3, 4, 5] ); // работает, начиная с PHP v.7.0Разница между const и define()
- Константы с использованием
constдолжны быть объявлены в верхней области видимости. То есть, не допускается объявление констант внутри функций/циклов/выраженийifилиtry/catchблоковif ( 1 ) { const NAME = 'VALUE'; // не работает } // но if ( 1 ) { define( 'NAME', 'VALUE' ); // работает } constвсегда регистрозависима.define()— регистронезависима.define( 'NAME', 'VALUE', true ); echo NAME; // VALUE echo name; // VALUE const NAME1 = 'VALUE'; echo name1 // Константы не существуетconstпонимает только скаляры, массивы и выражения из примитивов. Но define() можно передать переменные, функции, выраженияconst FOO = $var; // Parse error const FOO = home_url(); // Parse error define( 'FOO', $var ); // нет ошибок define( 'FOO', home_url() ); // нет ошибокС версии PHP 5.6 в const также можно указывать примитивные выражения и массивы, а не только скаляры.constможет хранить массивы с версии PHP 5.6, аdefineс PHP 7.0const FOO = [1, 2, 3]; // работает с PHP 5.6 define( 'FOO', [1, 2, 3] ); // работает с PHP 7.0constзависит от пространства имен, аdefineнет.
То есть, если создать константу в каком-либо namespace, то:- При использовании
const— константа будет находится в этом пространстве и не будет доступна вне его. - При использовании
define— константа регистрируется как глобальная и будет доступна за пределами namespace.
- При использовании
Итог.Определять константу почти всегда лучше с помощью define(), потому что тут больше возможностей и меньше вариантов «поймать» ошибку. Исключения:
- У вас версия PHP 5.6 и вам нужно сохранить массив в константу, тут поможет const.
- Вам нужно, чтобы константа была не в глобальной видимости, а в видимости пространства имен (namespace).
isset() и empty()
| Выражение | isset($a) | empty($a) |
|---|---|---|
| unset($a) | false | true |
| $a = null | false | true |
| $a = 0 | true | true |
| $a = «» | true | true |
| $a = array() | true | true |
| $a = false | true | true |
| $a = true | true | false |
| $a = 7 | true | false |
echo(), print(), print_r(), var_dump()
Эти функции (конструкции) в PHP имеют некоторые отличия:
echo(): Это не функция, а конструкция языка. Она используется для вывода одного или более строковых значений. Можно использовать несколько аргументов через запятую для вывода. echo не возвращает значение. Скобки не требуются, т.к. это не функция, а языковая конструкция.print(): Также является конструкцией языка и используется для вывода строки.print()всегда возвращает 1, поэтому её можно использовать в выражениях. Конструкция принимает только один аргумент. Так как это не функция, а языковая конструкция, скобки послеprint()не требуются.print_r(): Эта функция используется для вывода информации о переменной в удобочитаемом формате. Она предназначена для отладки и обычно используется для вывода массивов.print_r()отображает значение переменной, структуру и типы данных.var_dump(): Эта функция также используется для вывода информации о переменной, но более подробно. Она отображает значение переменной, её тип и длину, структуру и значения всех элементов в массивах и объектах.
Таким образом,
echo()иprint()предназначены для вывода простых строк, в то время какprint_r()иvar_dump()полезны для вывода значений переменных в удобочитаемом и более детальном виде для отладки.

Об авторе
Сергей Житников - Веб-разработчик
Занимаюсь веб-разработкой более 5 лет. Специализируюсь на создании адаптивных сайтов и веб-приложений на HTML5, CSS3 и JavaScript. Работаю с популярными CMS и фреймворками, а также уделяю большое внимание оптимизации производительности и чистоте кода.
Есть проект или идея? Буду рад помочь!
Связаться со мной