猿问

严格标准:只有变量才能通过引用传递。

严格标准:只有变量才能通过引用传递。

$el = array_shift($instance->find(..))

上面的代码以某种方式报告了严格的标准警告,但这不会:

function get_arr(){
    return array(1,2);}$el = array_shift(get_arr());

那么,它什么时候会报告警告呢?


慕妹3146593
浏览 538回答 4
4回答

斯蒂芬大帝

考虑以下代码:error_reporting(E_STRICT);class test {     function test_arr(&$a) {         var_dump($a);        }     function get_arr() {         return array(1,2);       }}$t= new test;$t->test_arr($t->get_arr());这将产生以下输出:Strict Standards: Only variables should be passed by reference in `test.php` on line 14array(2) {   [0]=>   int(1)   [1]=>   int(2)}原因是什么?这个test::get_arr()方法不是变量,在严格模式下,这将生成警告。此行为非常不直观,因为get_arr()方法回报数组值。要在严格模式下避免此错误,要么更改方法的签名,使其不使用引用:function test_arr($a) {     var_dump($a);  }因为您不能更改array_shift还可以使用中间变量:$inter= get_arr();$el= array_shift($inter);

慕工程0101907

$instance->find()返回对变量的引用。当您试图将此引用用作函数的参数时,您将得到报告,而不首先将其存储在变量处。这有助于防止内存泄漏,并可能成为下一个PHP版本中的错误。如果您的第2段代码写得类似(注意&in函数签名),则会抛出错误:function &get_arr(){     return array(1,2);}$el = array_shift(get_arr());因此,一个快速(也不是很好)的修复方法是:$el = array_shift($tmp = $instance->find(..));基本上,首先对临时变量执行赋值,然后将变量作为参数发送。

慕桂英4014372

第二个片段也不起作用,这就是原因。array_shift是一个修饰符函数,它改变了它的参数,因此它期望它的参数是一个引用,并且您不能引用不是变量的东西。见Rasmus在此的解释:严格的标准:只有变量才能通过引用。
随时随地看视频慕课网APP
我要回答