【问题标题】:Array function not iterating using array_shift()数组函数不使用 array_shift() 进行迭代
【发布时间】:2020-09-25 03:25:51
【问题描述】:

下面,箭头函数调用时,为什么我只得到第一个条目?

<?php

$stack = array("orange", "banana", "apple", "raspberry");
$fruit = fn() => array_shift($stack);

var_dump($fruit());
var_dump($fruit());
var_dump($fruit());
var_dump($fruit());

给予:

string(6) "orange"
string(6) "orange"
string(6) "orange"
string(6) "orange"

https://3v4l.org/6sTm9

【问题讨论】:

    标签: php arrays arrow-functions


    【解决方案1】:

    来自manual

    按值绑定意味着不能从外部范围修改任何值

    和:

    箭头函数自动按值捕获变量...当表达式中使用的变量在父作用域中定义时,它将被隐式按值捕获

    因此您的函数无法修改$stack 的值,因此它每次都返回相同的值。做你想做的事(函数没有参数)你需要一个匿名函数:

    $fruit = function () use (&$stack) { return array_shift($stack); };
    
    var_dump($fruit());
    var_dump($fruit());
    var_dump($fruit());
    var_dump($fruit());
    

    输出:

    string(6) "orange"
    string(6) "banana"
    string(5) "apple"
    string(9) "raspberry"
    

    Demo on 3v4l.org

    如果愿意传递参数,可以使用箭头函数:

    $stack = array("orange", "banana", "apple", "raspberry");
    $fruit = fn(&$s) => array_shift($s);
    
    var_dump($fruit($stack));
    var_dump($fruit($stack));
    var_dump($fruit($stack));
    var_dump($fruit($stack));
    

    输出:

    string(6) "orange"
    string(6) "banana"
    string(5) "apple"
    string(9) "raspberry"
    

    Demo on 3v4l.org

    【讨论】:

    • 我也认为手册中的这一部分很有用:“箭头函数自动按值捕获变量......当表达式中使用的变量在父范围内定义时,它将被隐式按值捕获”
    • @NickParsons 好点;我已将其包含在答案中。
    猜你喜欢
    • 1970-01-01
    • 2020-10-18
    • 2020-03-27
    • 2019-05-24
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多