"Only variables should be passed by reference"是什么概念?
What's the concept of "Only variables should be passed by reference"?
这是我的代码:
$page = explode("/", Request::url());
$page = end($page);
如您所知,$page
包含 URL 的最后一个参数。上面的代码也可以正常工作。
但是当我这样写的时候:
$page = end(explode("/", Request::url()));
然后令人惊讶的是它抛出了这个错误:
Only variables should be passed by reference
为什么?
explode(...)
被评估,创建一个实例,在第一个示例中由您的变量 $page
拥有。然后你通过引用传递那个实例 end(...)
,结束一切都很好。
在第二种情况下,它根本不被拥有,只是被创建,然后没有被任何变量持有,所以临时实例立即被释放,然后才传递给end(...)
.
这并不奇怪。当通过引用传递值时,这意味着函数可以更改变量并且更改将在函数外部可见。拿这个代码:
$byValue = 5;
function passByValue($variable)
{
$variable++;
echo 'Value inside ' . $variable . PHP_EOL;
}
passByValue($byValue);
echo 'Value outside ' . $byValue . PHP_EOL;
$byReference = 10;
function passByReference(&$variable)
{
$variable++;
echo 'Value inside ' . $variable . PHP_EOL;
}
passByReference($byReference);
echo 'Value outside ' . $byReference . PHP_EOL;
这意味着 passByReference 函数需要访问存储变量的内存位置才能更改它,并且要使该内存位置存在,您需要有一个指向它的变量。然而,函数的结果是 "volatile",如果它没有存储在变量中,它将被垃圾收集,因此不能通过引用传递。
end()、next()等函数需要通过引用传递参数来改变它们的内部状态。
这是我的代码:
$page = explode("/", Request::url());
$page = end($page);
如您所知,$page
包含 URL 的最后一个参数。上面的代码也可以正常工作。
但是当我这样写的时候:
$page = end(explode("/", Request::url()));
然后令人惊讶的是它抛出了这个错误:
Only variables should be passed by reference
为什么?
explode(...)
被评估,创建一个实例,在第一个示例中由您的变量 $page
拥有。然后你通过引用传递那个实例 end(...)
,结束一切都很好。
在第二种情况下,它根本不被拥有,只是被创建,然后没有被任何变量持有,所以临时实例立即被释放,然后才传递给end(...)
.
这并不奇怪。当通过引用传递值时,这意味着函数可以更改变量并且更改将在函数外部可见。拿这个代码:
$byValue = 5;
function passByValue($variable)
{
$variable++;
echo 'Value inside ' . $variable . PHP_EOL;
}
passByValue($byValue);
echo 'Value outside ' . $byValue . PHP_EOL;
$byReference = 10;
function passByReference(&$variable)
{
$variable++;
echo 'Value inside ' . $variable . PHP_EOL;
}
passByReference($byReference);
echo 'Value outside ' . $byReference . PHP_EOL;
这意味着 passByReference 函数需要访问存储变量的内存位置才能更改它,并且要使该内存位置存在,您需要有一个指向它的变量。然而,函数的结果是 "volatile",如果它没有存储在变量中,它将被垃圾收集,因此不能通过引用传递。
end()、next()等函数需要通过引用传递参数来改变它们的内部状态。