Читая советы по производительности 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'));
Позже, очевидно, сэкономит вам память … очень мало в этом случае, но вы все равно сохраните некоторые …