为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕妹3146593 2019-06-01 16:28:30
严格标准:只有变量才能通过引用传递。$el = array_shift($instance->find(..))上面的代码以某种方式报告了严格的标准警告,但这不会:function get_arr(){     return array(1,2);}$el = array_shift(get_arr());那么,它什么时候会报告警告呢?
查看完整描述

4 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

考虑以下代码:

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);


查看完整回答
反对 回复 2019-06-01
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

$instance->find()返回对变量的引用。

当您试图将此引用用作函数的参数时,您将得到报告,而不首先将其存储在变量处。

这有助于防止内存泄漏,并可能成为下一个PHP版本中的错误。

如果您的第2段代码写得类似(注意&in函数签名),则会抛出错误:

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

因此,一个快速(也不是很好)的修复方法是:

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

基本上,首先对临时变量执行赋值,然后将变量作为参数发送。


查看完整回答
反对 回复 2019-06-01
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

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


查看完整回答
反对 回复 2019-06-01
  • 4 回答
  • 0 关注
  • 537 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信