为什么我得到“只有变量应该通过引用传递”错误?

时间:2013-12-25 19:19:03

标签: php variables pass-by-reference

查看此代码:

$last = end($p = explode('/', $someString));  

获得此通知:

  

只应通过引用传递变量

我真的很困惑,因为$p是一个变量。

4 个答案:

答案 0 :(得分:12)

end()期望变量,而不是引用。在你的例子$p = explode('/', $someString)不是变量,它是一个赋值。正如documentation所说:

  

此数组通过引用传递,因为它由函数修改。这意味着你必须传递一个实变量,而不是一个返回数组的函数,因为只有实际的变量可以通过引用传递。

你应该这样做:

$p = explode('/', $someString);
$last = end($p); 

答案 1 :(得分:11)

函数end()需要一个实数变量,而不是一个返回数组的函数,但是如果你把函数return放在双括号中,PHP就不会报告严格的标准声明:

$last = end( ( explode( '/', $someString ) ) );

答案 2 :(得分:5)

问题是你正在为一个函数做赋值,而传递给$ last的值实际上是函数的结果,而不是$ p。并且,explode返回对变量的引用。

分为两行:

$p = explode('/', $someString);
$last = end($p);  

除非你以后使用$ p,否则没有理由在end()的函数调用中分配$ p。为了风格清晰,无论如何我建议分两步完成。

答案 3 :(得分:3)

end()这样的函数会影响变量并改变它们的值,如果它们应该这样,并且正如我们所知,它意味着通过参考!但是这种过往需要倾向,我们不能毫不在意地将事情推向他们!

在给予Only variables should be passed by reference实际上问题不是那个变量,但是你在尝试end($p = explode('/', $someString));时做了这个但是把它传递给函数的那种,因为你不允许在它上面做引用在调用end() 时,您将Expression作为输入而不是变量。

<强>表达式

  

PHP以更多其他方式进一步表达表达式   语言呢。从某种意义上说,PHP是一种面向表达的语言   几乎所有东西都是表达。考虑一下我们的例子   已经处理过,$ a = 5.很容易看出有两个值   这里涉及的是整数常数5的值,以及值   $ a也被更新为5。 但事实是,有   这里涉及一个额外的价值,那就是价值   任务本身。赋值本身评估为已分配的   值,在这种情况下5.实际上,它意味着$ a = 5,无论如何   它的作用是一个值为5的表达式。因此,写作   像$ b =($ a = 5)之类的东西就像写$ a = 5; $ b = 5; (一个   分号标志着声明的结束)。由于分配了分配   在从右到左的顺序中,你也可以写$ b = $ a = 5。

这个错误在你的情况下只是一种严格的错误而不是致命错误!嗯,你知道PHP是一种严格的编程语言。但您可以手动禁用它们。这不会改变结果。

关于这个问题的一些例子:

function foo($a)
{
    return ++$a;
};
$b = 1;
echo foo(&$b);

错误

自PHP 5.3.0以来

Fatal error: Call-time pass-by-reference has been removed; If you would like to pass argument by reference, modify the declaration of foo()

function foo(&$a)
{
    return ++$a;
};
echo foo($b = 1); // output: 2

我们之前见过 Strict Standards: Only variables should be passed by reference