引擎盖下的PHP行为

时间:2015-02-20 08:34:14

标签: php

我只是想知道在这种情况下PHP是如何工作的。假设我有这两段代码:

function foo() {
    return 2 * 2;
}

// First.
if (foo()) {
    bar(foo());
}

// Second.
if (($ref = foo())) {
    bar($ref);
}

现在问题:

  1. 在第一种情况下,PHP是否在if子句中创建了某种临时变量?如果是这样,第二段代码总是更好吗?

  2. 第二种情况会占用更多内存吗?如果对第一个问题回答第一个问题是肯定的,那么不是吗?

3 个答案:

答案 0 :(得分:1)

这两个代码不相同,因为第一个代码调用foo()两次(如果它返回真值)。如果它有副作用,例如打印某些东西,它们将被完成两次。或者如果它依赖于可以改变的东西(例如文件或数据库的内容),则两个调用可以返回不同的值。在你只是将两个数字相乘的例子中,这不会发生,但它仍然意味着它必须进行额外的乘法,这是不必要的。

您的问题的答案是:

  1. 是的,它需要将返回的值保存在临时内存位置,以便它可以测试它是否为真。

  2. 是的,它使用了更多的内存。在第一个版本中,只要if测试完成,就可以回收临时存储器。在第二个版本中,在重新分配变量$foo或超出范围之前,不会回收它。

答案 1 :(得分:0)

  1. 在第一种情况下,您正在调用一个函数两次,因此,如果函数很耗时,则效率很低。第二种情况确实更好,因为您要保存foo()的结果。

  2. 在这两种情况下,PHP都需要根据foo()生成的数据来分配内存。稍后将通过垃圾收集器释放该内存。在内存方面,两种情况都非常相同。也许记忆会提前发布,也许不会,但很可能你不会遇到重要的情况。

答案 2 :(得分:0)

PHP无法生成任何临时变量,因为它无法确定foo()的返回值是否始终相同。 microtime()rand()将为每次调用返回不同的值,例如。

在第二个例子中,它需要更多的内存,因为PHP需要在内存中创建并保留值。

以下是测试方法:

<?php

function foo() {
    return true;
}

function bar($bool) {
    echo memory_get_usage();
}

if (1) {
    // 253632 bytes on my machine
    if (foo()) {
        bar(foo());
    }
} else {
    // 253720 bytes on my machine
    if (($ref = foo())) {
        bar($ref);
    }
}