8

阅读Google Developers PHP 性能提示时,我发现不建议额外复制一个变量。

而不是这个:

$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']
4

2 回答 2

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;

关键是,不必要的变量确实会造成混乱,并可能与您在其他地方定义的变量发生冲突。

于 2012-07-10T15:51:03.213 回答
4

如果您不需要 $description 的“副本”,那么更清晰的方法肯定是:

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'));

后者显然会节省你的记忆......在这种情况下很少,但你仍然会节省一些......

于 2012-07-10T15:48:36.077 回答