繁体   English   中英

我如何在php lambda函数中使用参考变量

[英]how can i use reference variable in php lambda function

public function getAllByField(array &$condition)
{
    return $this->repository->scopeQuery(
        function ($query) use (&$condition) {
            return $query->where('status', '!=', '9')->whereRaw(
                array_reduce(
                    array_keys($condition), function ($carry, $k) use (&$condition) {
                        if(in_array('json', $item = $condition[$k])) {
                            $jsonColumns = explode('->', $item[0]);
                            unset($condition[$k]);

                            return  'JSON_VALUE('.$jsonColumns[0].',\'$.'.$jsonColumns[1].'\') '
                                    .$item[1].' '
                                    .(is_string($item[2])? '\''.$item[2].'\'':$item[2]);
                        }
                    }
                )
            );
        }
    )->findWhere($condition)->all();
}

我在通过引用设置的方法$condition变量中定义了上述方法,并且在查询中未设置某些值,但是当我在最后一行中使用$condition ,此change( unset() )无法保存! 如何保存已更改的$condition

您的错误是在签名中使用array $condition而不是array &$condition ,因此在lambas中的所有引用都是对初始副本的引用。 这是一个小例子:

function removeTest(array &$condition)
{
    (function () use (&$condition) {
        if (isset($condition["test"])) {
            unset($condition["test"]);
        }
    })();
}

$arr = ["test" => "test", "test2" => "test2"];
removeTest($arr);
print_r($arr); // prints ["test2" => "test2"]

如果在removeTest签名中删除了初始&,则lambda通过引用使用变量并不重要,因为第一次调用将进行复制,并且原始$arr保持不变。

如果要使用对象,则必须始终通过引用进行操作:

function removeTest($condition)
{
    (function () use ($condition) {
        if (isset($condition->test)) {
            unset($condition->test);
        }
    })();
}

$obj = (object) ["test" => "test", "test2" => "test2"];
removeTest($obj);
print_r($obj); // prints stdClass Object("test2" => "test2")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM