"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()等函数需要通过引用传递参数来改变它们的内部状态。