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

Mar*_*ato 8 php optimization performance

阅读Google Developers PHP性能提示我看到不建议制作变量的额外副本.

而不是这个:

$description = strip_tags($_POST['description']);
echo $description;
Run Code Online (Sandbox Code Playgroud)

它推荐这个:

echo strip_tags($_POST['description']);
Run Code Online (Sandbox Code Playgroud)

原因是可能不必要的内存消耗.

但是做了一些搜索,我看到一些反驳说PHP实现了"copy-on-write"内存管理.这基本上意味着我们可以为我们喜欢的变量分配一个值,而不必担心实际复制的数据.

所以,我想知道,如果在更复杂的情况,其中,例如$_POST$_GET变量将在代码中的很多地方都可以使用,无论是更好的做法是使用或不使用额外的变量,考虑到这些标准:

1)安全

2)维护/可读性

3)表现

编辑1

我将使用下面的示例来更好地说明问题.

这种代码更好(考虑上面的标准):

$user = anti_injection($_POST['user']);
$pass = anti_injection($_POST['pass']);

// Continue the code using $user and $pass
Run Code Online (Sandbox Code Playgroud)

或这个?

$_POST['user'] = anti_injection($_POST['user']);
$_POST['pass'] = anti_injection($_POST['pass']);

// Continue the code using $_POST['user'] and $_POST['pass']
Run Code Online (Sandbox Code Playgroud)

Nie*_*sol 4

PHP 的“惰性复制”仅适用于数组。仅当数组的一个副本发生更改时,数组的数据才会重复,这就是为什么循环可以foreach在原始数组的副本上运行的原因。

对象通过引用传递,即使没有被告知这样做&。例子:

$a = new StdClass();
$b = $a;
$b->derp = "foo";
var_dump($a->derp); // "foo"
Run Code Online (Sandbox Code Playgroud)

资源是对特定扩展要使用的资源的引用,因此无法有意义地复制它们。

其他的都是直接复制的。


无论如何,应该避免不必要的变量。例如,而不是:

$step1 = 123;
$step2 = $step1 * 4;
$step3 = $step2 + 99;
$step4 = $step3 / 3;
echo $step4;
Run Code Online (Sandbox Code Playgroud)

你可以这样写:

echo (123*4+99)/3;
Run Code Online (Sandbox Code Playgroud)

(或者,在这种情况下,只是echo 197;

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