Глобальные, локальные, статические переменные PHP

Глобальные переменные - это переменные, которые доступны всей программе, включая подпрограммы (пользовательские функции).
Локальные переменные - переменные, определенные внутри подпрограммы (пользовательской функции). Они доступны только внутри функции, в которой они определены.
Для PHP все объявленные функции изначально являются локальными, то есть, по умолчанию нет возможности изменить значение глобальной переменной в теле функции.
Если в теле пользовательской функции использовать переменную, которая совпадает с именем глобальной переменной(находящейся вне пользовательской функции), то ничего общего она не будет иметь с этой глобальной переменной. В данной ситуации в пользовательской функции будет создана локальная переменная, совпадающая с именем глобальной переменной, но доступна данная локальная переменная будет только внутри этой пользовательской функции.
Рассмотрим на примере:

<?php 
$a = 100;
 
function funct() {
$a = 70;
 echo "<h4>$a</h4>";
}
funct();
echo "<h2>$a</h2>";
?>

Сценарий сначала выведет 70, а потом 100.
70
100

Чтобы избавиться от данной проблемы, в PHP существует специальная инструкция global
. Она позволяет пользовательской функции работать с глобальными переменными. Ниже приведёт пример:
<?php
$a = 1;
$b = 2;
 
function Sum()
{
     global $a, $b;
 
     $b = $a + $b;
} 
 
Sum();
echo $b;
?>

Скрипт выведет "3". После определения $a и $b внутри функции как global все ссылки на любую из этих переменных будут указывать на их глобальную версию. Не существует никаких ограничений на количество глобальных переменных, которые могут обрабатываться пользовательскими функциями.

Второй способ доступа к переменным глобальной области видимости - использование специального, определяемого PHP массива $GLOBALS. Предыдущий пример может быть переписан так (использование $GLOBALS вместо global):

<?php
$a = 1;
$b = 2;
 
function Sum()
{
     $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];
} 
 
Sum();
echo $b;
?>

$GLOBALS - это ассоциативный массив, ключом которого является имя, а значением - содержимое глобальной переменной. Обратите внимание, что $GLOBALS существует в любой области видимости, это объясняется тем, что этот массив является суперглобальным. Ниже приведен пример, демонстрирующий возможности суперглобальных переменных:
function test_global()
{
     // Большинство предопределенных переменных не являются
     // "супер" и чтобы быть доступными в локальной области
     // видимости функции требуют указания 'global'.
     global $HTTP_POST_VARS;
 
     echo $HTTP_POST_VARS['name'];
 
     // Суперглобальные переменные доступны в любой области
     // видимости и не требуют указания 'global'.
     // Суперглобальные переменные доступны, начиная с PHP 4.1.0
     echo $_POST['name'];
}
?>

Переменная, объявленная внутри пользовательской функции, считается локальной; другими словами, на нее можно ссылаться только в этой функции. Любое присваивание вне функции не имеет ничего общего с переменной, объявленной внутри функции. При выходе из пользовательской функции, в которой была объявлена локальная переменная, эта переменная и ее значение уничтожаются.
Основное достоинство локальных переменных — отсутствие непредвиденных ситуаций, связанных со случайной или намеренной модификацией глобальной переменной. Рассмотрим следующий пример:

<?php
$a = 1; /* глобальная область видимости */ 
 
function Test()
{ 
     echo $a; /* ссылка на переменную локальной области видимости */ 
} 
 
Test();
?>

Этот скрипт не сгенерирует никакого вывода, поскольку выражение echo указывает на локальную переменную $a, а в пределах локальной области видимости ей не не было присвоено значение.
Подход к области видимости в PHP отличается от языка C в том, что глобальные переменные в C автоматически доступны функциям, если только они не были перезаписаны локальным определением. В PHP, если глобальная переменная будет использоваться внутри функции, она должна быть объявлена глобальной внутри нее:
<?php
$a = 1; /* глобальная область видимости */ 
 
function Test()
{ 
global $a; /* Объявляем переменную $a глобальной */
echo $a; /* ссылка на переменную локальной области видимости */ 
} 
 
Test();
?>

В результате работы скрипта функция test() возвратит "1", поскольку мы объявили переменную $a глобальной, то есть, сделали переменную $a доступной для всей программы (скрипта).

Кроме глобальных и локальных переменных, в PHO существует ещё один тип переменных - статические переменные.
Статическая переменная существует только в локальной области видимости функции, но не теряет своего значения, когда выполнение программы выходит из этой области видимости.
Рассмотрим примеры объявления статических переменных:

<?php
function funct(){
     static $int = 0;          // верно
     static $int = 1+2;        // неверно  (поскольку это выражение)
     static $int = sqrt(121);  // неверно  (поскольку это тоже выражение)
 
     $int++;
     echo $int;
}
?>

Пример работы пользовательской функции, содержащей статические переменные:
<?php
   function funct()
   {
      static $a;
      $a++;
      echo "$a";
   }
   for ($i = 0; $i++<10;) funct();
?>

Данный сценарий выводит строку:
1 2 3 4 5 6 7 8 9 10
Если мы удалим инструкцию static, будет выведена строка:
1 1 1 1 1 1 1 1 1 1
Это связано с тем, что переменная $a будет удаляться при завершении работы функции и обнуляться при каждом ее вызове. Переменная $a инкрементируется сразу после обнуления, а только потом выводится.