Преимущество / недостаток глобальных переменных и функциональных параметров в PHP?

жаль, что я новичок, и я не могу определить, насколько хорош вопрос, возможно, это звучит совершенно очевидно для некоторых из вас.

если наше использование этих двух ниже одинаково, что лучше?

function doSomething ($var1,$var2,..){ ... } 

ИЛИ

 function doSomething (){ global $var1,$var2,..; ... } 

по нашему использованию, я имею в виду, что я знаю, что во втором сценарии мы также можем изменить значение глобальных переменных. но что, если нам не нужно это делать, это лучший способ написать эту функцию? переменные передают меньше памяти, чем объявляют глобальные функции?

Использование памяти – ничтожное беспокойство. Гораздо важнее, чтобы код был легко следовать и не иметь … непредсказуемых … результатов. Добавление глобальных переменных – это ОЧЕНЬ ПЛОХАЯ ИДЕЯ с этой точки зрения, ИМО.

Если вас беспокоит использование памяти, нужно сделать следующее:

 function doSomething (&$var1, &$var2,..) { ... } 

Это передаст переменные по ссылке и не создаст новые копии из них в памяти. Если вы измените их во время выполнения функции, эти изменения будут отражены, когда выполнение вернется к вызывающему.

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

 function doSomething ($var1, $var2) { ... } 

Избегайте использования глобальных переменных, вместо этого используйте переменные passing в параметрах. В зависимости от размера вашей программы производительность может быть незначительной.

Но если вы заинтересованы в производительности, здесь есть несколько ключевых замечаний о производительности глобальной переменной применительно к локальным переменным (переменные, определенные внутри функций).

  • Приращение глобальной переменной в 2 раза медленнее, чем локальная переменная.
  • Просто объявление глобальной переменной без использования ее в функции также замедляет работу (примерно на ту же сумму, что и приращение локального var). PHP, вероятно, проверяет наличие глобального.

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

Напишите его, чтобы взять параметры. Поддержание работоспособности гораздо важнее, чем микро-оптимизация. Когда вы принимаете параметры, переменные не могут быть изменены в неожиданных местах.

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

Как альтернатива, вы можете передать один параметр (или два, если он действительно идет с функцией, например, exp), а остальное в массиве параметров (немного как jquery). Таким образом, вы не используете глобальные переменные, имеете некоторую гибкость параметров и четко определили значения по умолчанию для каждого параметра.

 function get_things($thing_name,$opt= array() { if(!isset($opt["order"])) $opt["order"]= 'ASC'; } 

Переходите в параметры, избегайте глобальных привязок. Хранение только объема, необходимого для конкретной ситуации, является мерой хорошего дизайна кода. Вы можете взглянуть на область переменных PHP …

http://php.net/manual/en/language.variables.scope.php

Отличный ресурс, с некоторыми указателями на то, что является лучшими практиками и управлением памятью.

Начиная с PHP 4 с использованием глобальных переменных с большими переменными существенно влияет на производительность.

Имея в $ data строку 3Mb с данными двоичной карты и запуская тесты 10k, если бит равен 0 или 1 для другого глобального использования, дает следующие результаты:

 function getBit($pos) { global $data; $posByte = floor($pos/8); ... } 

t5 бит открыт: 0.05495s, искать: 5.04544s, все: 5.10039s

 function getBit($data) { global $_bin_point; $pos = $_bin_point; $posByte = floor($pos/8); } 

t5 бит открыт: 0.03947s, искать: 0.12345s, все: 0.16292s

 function getBit($data, $pos) { $posByte = floor($pos/8); ... } 

t5 бит открыт: 0.05179s, искать: 0.08856s, все: 0.14035s

Таким образом, параметры передачи быстрее, чем использование глобальных переменных> = 3Mb. Не тестировали с передачей справки $ & data и не тестировали с помощью PHP5.