查看此代码:
$last = end($p = explode('/', $someString));
获得此通知:
只应通过引用传递变量
我真的很困惑,因为$p
是一个变量。
答案 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