Номер телефона

Последнее обновление:

О глобальных переменных в языке РНР

Существуют различные мнения насчет того, целесообразно ли использовать глобальные переменные в скриптах РНР или нет. Конечно, если вызов глобальной переменной происходит всего несколько раз – беспокоиться не стоит, влияние будет очень небольшим. Однако, когда глобальная переменная многократно используется (например, в цикле), то тогда есть смысл оценить, так ли обязательно их использовать.

Рассмотрим небольшой условный практический пример, иллюстрирующий проблему. Приведенный ниже код содержит цикл в 500 итераций и 90 рекурсивных вызовов.


<?php

$tim = (float)microtime(true);

$arr = array_fill(0, 500, md5(rand(1, 10)));

$r = 0;


function requrse($arr, $r){

   static $r;

   $x = 0;


//    global $arr;


       for($i=0; $i < sizeof($arr); $i++){

           $x .= $arr[$i].'rty';

       }


       if($r < 90){

           $r++;

           $y = requrse($arr, $r);

           $x .= $y[0];

       }

   return array($x, $r);

}

$y = requrse($arr, $r);

echo (float)microtime(true) - $tim;


Пока строчка global $arr; закомментирована, т.е. массив $arr является локальным для функции requrse(). Время выполнения данной программы составляет 0,07…0,1 сек.

А что будет, если раскомментировать данную строчку?

Тогда переменная $arr будет глобальной. Интересно, что время выполнения программы только в результате этого… вырастет до 1 сек. с лишним, т.е. более, чем на порядок. И это, повторимся, только от того, что переменную сделали глобальной.

Еще более разительные результату получаются, если увеличить число итераций цикла, скажем, на порядок (до 5000). Тогда в первом случае (когда переменная $arr является докальной) время выполнения скрипта составит примерно 0,7…1 сек. Тогда как если раскомментировать указанную строчку, сделав $arr глобальной переменной, то скрипту не хватает даже 30 секунд(!). Далее он завершается, т.к. истекает лимит времени выполнения.

Т.е. чем больше итераций цикла, тем (при сохранении количества рекурсивных вызовов) гораздо дольше будет выполняться скрипт. Причем, если в первом случае (для локальной переменной, точнее, массива) время выполнения выросло примерно в 10 раз, т.е. пропорционально размерности массива, то если переменную $arr сделать глобальной, то время выполнения вырастет не в 10 раз, а гораздо выше.

Это означает, что в данном случае использование глобальных переменных просто противопоказано.

Кроме того, известно, что при использовании глобальных переменных в функциях существенно усложняется или становится вообще невозможным их тестирование. В самом деле, если переменная, используемая в функции, является глобальной, это означает, что ее может изменить ЛЮБАЯ функция, в которой такая переменная фигурирует. Поэтому при этом тестировщик должен тестировать все те функции и участки кода РНР, в которых такая переменная используется.

Кстати, то же самое будет, если переменную передавать в функцию по ссылке, т.е. примерно так:

function requrse(&$arr, $r){

...

}

И в этом случае скрипт будет выполняться более, чем 30 сек. (при размерности массива, равной 5000).

А все потому, что такие переменные (передаваемые по ссылке или являющиеся глобальными) являются динамическими. И, следовательно, на них тратится больше ресурсов интерпретатором языка РНР.

Поэтому, прежде, чем использовать глобальные переменные или передачу значения переменной (массива) по ссылке, следует много раз подумать – а стоит ли это делать. Одно дело, если глобальной будет не массив, а лишь переменная, содержащая одно (небольшое) значение. В том смысле, что это будет переменная целого типа или строка из нескольких символов. И совсем другое дело, когда глобальная переменная представляет собой большой массив – в этом случае целесообразнее передавать ее в функцию «обычным» образом, т.е. как локальную переменную.


Комментарии:
Всего комментариев:0
Пожалуйста, не забудьте ознакомиться с правилами оставления комментариев.



Подписаться на комментарии на этой странице

Мы можем выполнить

Другие услуги
Интересная и полезная
информация
НАПИШИТЕ НАМ
Яндекс.Метрика
Номер телефона
© Copyright Все права защищены 2013-2024 Научный консалтинг