阅读Google Developers PHP performance tips我看到不建议制作一份变量的额外副本。
而不是:
$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']
答案 0 :(得分:4)
如果您不需要$ description的“副本”,更明确的方法肯定是:
echo strip_tags($_POST['description']);
关于性能,正如您所说,PHP仍将在内存中创建结果值并将其分配给Z_Data结构,因此仍然消耗内存。因此,使用第一种或第二种方法不会更快或更少内存。
最后,安全性与内存消耗无关,但您需要记住如何正确清理输出。使用strip-tags很好,添加斜杠是另一种防止黑客使用XSS注入的好方法。
另请注意,关于您的写时复制,如果您这样做:
$description = 'Hello-world';
$trimmed_description = str_replace('-', ' ', $description);
$escaped = htmlentities($trimmed_description);
echo $escaped;
而不是
echo htmlentities(str_replace('-', ' ', 'Hello-world'));
后者显然会节省你的记忆......在这种情况下很少,但你仍然可以节省一些......
答案 1 :(得分:4)
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;
)
关键是,非专用变量确实会产生混乱,并且可能与您在其他地方定义的变量发生冲突。