复制或不复制PHP中的额外变量?

时间:2012-07-10 15:43:59

标签: php performance optimization

阅读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']

2 个答案:

答案 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;

关键是,非专用变量确实会产生混乱,并且可能与您在其他地方定义的变量发生冲突。