Скопировать или не копировать дополнительные переменные в PHP?

Читая советы по производительности PHP для разработчиков Google, я увидел, что не рекомендуется делать дополнительную копию разновидности.

Вместо этого:

$description = strip_tags($_POST['description']); echo $description; 

Он рекомендует следующее:

 echo strip_tags($_POST['description']); 

Причина – возможное ненужное потребление памяти.

Но, выполняя некоторые поисковые запросы, я видел некоторые опровержения о том, что PHP реализует управление памятью «копирование на запись». Это в основном означает, что мы можем присвоить значение как можно большему числу переменных, не беспокоясь о фактически скопированных данных.

Поэтому я хотел бы знать, если в более сложных ситуациях, где, например, переменные $_POST или $_GET будут использоваться во многих местах кода, лучше ли использовать или не использовать дополнительные переменные, учитывая эти критерии:

1) Безопасность

2) Техническое обслуживание / удобочитаемость

3) Производительность

ИЗМЕНИТЬ 1

Я буду использовать приведенный ниже пример, чтобы лучше осветить вопрос.

Лучше ли этот код (учитывая вышеприведенные критерии):

 $user = anti_injection($_POST['user']); $pass = anti_injection($_POST['pass']); // Continue the code using $user and $pass 

Или это?

 $_POST['user'] = anti_injection($_POST['user']); $_POST['pass'] = anti_injection($_POST['pass']); // Continue the code using $_POST['user'] and $_POST['pass'] 

«Ленивая копия» PHP применяется только к массивам. Данные массива дублируются только при изменении одной копии массива, поэтому для цикла foreach нормально работать с копией исходного массива.

Объекты передаются по ссылке, даже если это не сказано с помощью. Пример:

 $a = new StdClass(); $b = $a; $b->derp = "foo"; var_dump($a->derp); // "foo" 

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

Все остальное копируется напрямую.


В любом случае следует избегать ненужных переменных. Например, вместо:

 $step1 = 123; $step2 = $step1 * 4; $step3 = $step2 + 99; $step4 = $step3 / 3; echo $step4; 

Вы могли бы просто написать:

 echo (123*4+99)/3; 

(или, в данном случае, просто echo 197; )

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

Если вам не нужна «копия» описания $, более понятный подход определенно:

 echo strip_tags($_POST['description']); 

Что касается производительности, как вы сказали, PHP все равно создаст результирующее значение в памяти и назначит его структуре Z_Data, тем самым все еще потребляя память. Поэтому для использования первого или второго методов не требуется более или менее интенсивная память.

Наконец, безопасность не имеет ничего общего с потреблением памяти, но вам нужно помнить, как правильно очищать ваш вывод. Использование стриптиз-меток в порядке, добавление косой черты – еще один хороший способ предотвратить использование хакерами XSS.

Также обратите внимание, что если вы выполните следующее:

 $description = 'Hello-world'; $trimmed_description = str_replace('-', ' ', $description); $escaped = htmlentities($trimmed_description); echo $escaped; 

вместо

 echo htmlentities(str_replace('-', ' ', 'Hello-world')); 

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