看看这段代码:
$last = end($p = explode('/', $someString));
收到以下通知:
仅应按引用传递变量
我很困惑,因为$p
是一个变量。
看看这段代码:
$last = end($p = explode('/', $someString));
收到以下通知:
仅应按引用传递变量
我很困惑,因为$p
是一个变量。
end()
期望一个变量而不是一个引用。在你的例子中,$p = explode('/', $someString)
不是一个变量,而是一个赋值语句。正如文档所说:
这个数组被按引用传递,因为它被函数修改。这意味着你必须传递一个真正的变量而不是返回一个数组的函数,因为只有实际的变量可以按引用传递。
相反,你应该这样做:
$p = explode('/', $someString);
$last = end($p);
$p = explode('/', $someString)
并不是一个变量。我正在研究为什么要将引用作为参数而不是变量本身。 - Tchoupi$p = explode('/', $someString)
是一个语句,它返回的不是引用,而是值本身。也就是说,$a = $b = 'x'
,意味着将 $b
的值返回给 $a
,而不是 $b
的引用。在另一种情况下,OP正在询问的是,$a
将取决于 $b
的值(应用于 $b
的更改将影响 $a
的值),这是不明显的。默认情况下,它们应该是完全独立的,除非该值是一个对象,因为对象会隐式地通过引用传递。 - BlitZ函数end()需要一个实数变量而不是返回数组的函数,但是如果你将函数返回值放在双括号中,PHP就不会报告严格标准通知:
函数end()需要一个实数变量而不是返回数组的函数,但如果您将函数返回值放在双括号中,PHP不会报告严格标准通知:
$last = end( ( explode( '/', $someString ) ) );
$b = ($a = 5)
时,第二个部分不再是一个表达式,而是变成了一个变量。 - revoexplode
返回对变量的引用。$p = explode('/', $someString);
$last = end($p);
在end()函数调用内部赋值给$p是没有必要的,除非你后面还要使用$p。为了代码风格的清晰明了,我建议分两步来做。
像 end()
这样的函数会影响变量并改变它们的值,如果它们应该,这意味着传递的是引用!但这种传递需要一定的倾向性,我们不能毫不在意地将东西推给它们!
当出现 Only variables should be passed by reference
时,实际上问题不在于变量,而是在于当你尝试使用 end($p = explode('/', $someString));
时,将其传递给函数的方式,因为在调用 end()
时,你不被允许对其进行引用,你将一个表达式作为输入而不是一个变量。
表达式:
PHP采用了更进一步的表达式,就像其他许多语言一样。PHP是一种面向表达式的语言,几乎所有东西都是表达式。考虑我们已经处理过的示例$a = 5。很容易看出这里涉及到两个值,即整数常量5的值和正在更新为5的$a的值。但事实上,在这里涉及到一个额外的值,那就是赋值本身的值。赋值本身会评估为分配的值,在这种情况下为5。实际上,这意味着$a = 5,无论它做什么,都是一个具有值5的表达式。因此,编写类似$b = ($a = 5)的内容就像编写$a = 5; $b = 5;(分号表示语句的结尾)。由于赋值按从右到左的顺序解析,您还可以编写$b = $a = 5。这个问题的一些例子:
function foo($a)
{
return ++$a;
};
$b = 1;
echo foo(&$b);
错误:
致命错误: 已删除按引用传递的调用时间; 如果您想通过引用传递参数,请修改foo()的声明
自PHP 5.3.0起
或者
function foo(&$a)
{
return ++$a;
};
echo foo($b = 1); // output: 2
我们之前见过这个错误 Strict Standards: Only variables should be passed by reference
$someString
是一个数组吗? - demonking$p =
。 - demonking