gpt4 book ai didi

php - 将 create_function 用作闭包时从包含作用域引用变量。 PHP

转载 作者:可可西里 更新时间:2023-10-31 22:51:32 25 4
gpt4 key购买 nike

使用真正的闭包,我们可以做到,

function foo(&$ref)
{
$inFn = function() use (&$ref)
{
$ref = 42;
};

$inFn();
}

因此无需在对 $inFn 的调用中将其传递即可修改引用。

如果我们替换,

    $inFn = function(... 

    $inFn = create_function(...

是否有任何(简单而干净的)方法来做同样的事情;通过引用引用包含范围的变量没有显式传递它$inFn

最佳答案

我遇到了 this answer to another question这启发了我想出以下内容。我没有对它进行过大量测试,我相信它可以改进(需要 exec 调用是一种耻辱),但它似乎解决了我的问题。

class create_closure
{
private
$_cb = null,
$_use = array();

public function __construct(array $use, $closure_args, $closure_body)
{
$use_args = implode(array_keys($use), ',');

$this->_cb = create_function(
$use_args.($use_args==='' OR $closure_args==='' ? '' : ',').$closure_args,
$closure_body
);

$this->_use = array_values($use);

}

public static function callback(array $use, $closure_args, $closure_body)
{
$inst = new self($use, $closure_args, $closure_body);
return array($inst, 'exec');
}

public function exec()
{
return call_user_func_array(
$this->_cb,
array_merge($this->_use, func_get_args())
);
}
}

你可以这样使用它:

function foo(&$ref)
{
$inFn = new create_closure(
array('$ref'=>&$ref),
'',
'$ref=42;'
);
$inFn->exec();
}

$x = 23;
echo 'Before, $x = ', $x, '<br>';
foo($x);
echo 'After, $x = ', $x, '<br>';

哪个返回:

Before, $x = 23
After, $x = 42

或者像这样:

function bar()
{
$x = 0;
echo 'x is ', $x, '<br>';

$z = preg_replace_callback(
'#,#',
create_closure::callback(
array('$x'=>&$x),
'$matches',
'return ++$x;
'
),
'a,b,c,d'
);

echo 'z is ', $z, '<br>';
echo 'x is ', $x, '<br>';
}

bar();

哪个返回:

x is 0
z is a1b2c3d
x is 3

关于php - 将 create_function 用作闭包时从包含作用域引用变量。 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6486570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com