为什么标准不允许通过引用另一个函数来传递函数结果

时间:2014-12-14 21:56:20

标签: php

有一段时间你可能偶然发现了这个:Strict error: Only variables should be passed by reference。解决方法通常是添加一些你永远不会使用的临时变量。

但令我烦恼的是为什么这个警告甚至存在?它有用吗?如果我知道我不需要那个该死的变量,为什么不让我跳过它呢?当使用不是面向对象的旧API并使用疯狂的参考参数时,这是最烦人的。

1 个答案:

答案 0 :(得分:1)

FORTRAN用于通过引用传递所有参数。这可能会导致奇怪的问题,如:

FUNCTION DUBL(X)
    X = X + X
    DUBL = X
    RETURN
END

Y = DUBL(5.0)
Z = 5.0 + 1.0

最后一行将Z设置为11.0。这是因为最后一行中的函数调用导致5.0加倍,因此无论在源代码中出现5.0,它现在都意味着10.0。

部分原因是因为编译器试图节省内存,只会将每个文字常量值存储一次。如果每次提到它时都使用了5.0的单独副本,则问题仍然存在,但没有效果。 (如果一棵树在森林里翻了一番,没有人注意到,它真的翻了吗?)

但主要是因为你将一个非const引用传递给了一个文字,有效地将一个常量转换为一个变量。 (谚语是:"常数不是。变量不是。")

大多数现代语言要么不允许引用常量,要么只有在你明确限定它们时才允许它们。

对函数结果的非const引用被认为是禁忌,因为你基本上承诺它可以修改所引用的东西的功能,但这是误导,因为事情即将发生消失,用它进行所有修改。防止函数修改它会强制函数意识到如果它想对所引用的对象进行有意义的更改,它应该首先复制该对象。

很容易想出一个场景,无论如何它都会对修改对象有用(通常是因为函数在返回之前会再次引用它),但是还有很多场景会导致细微的很难诊断错误。程序员对严重性带来的不便感到不满,直到被松懈引起的错误所困扰,然后他们就会非常好。