加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

当使用create_function作为闭包时,从包含范围引用变量. PHP

发布时间:2020-12-13 16:30:57 所属栏目:PHP教程 来源:网络整理
导读:使用真正的关闭,我们可以做, function foo($ref){ $inFn = function() use ($ref) { $ref = 42; }; $inFn();} 因此修改引用而不必在调用$inFn时传递它. 如果我们更换, $inFn = function(... 同 $inFn = create_function(... 有没有(简单和干净)的方式做同样
使用真正的关闭,我们可以做,
function foo(&$ref)
{
    $inFn = function() use (&$ref)
    {   
        $ref = 42; 
    };  

    $inFn();
}

因此修改引用而不必在调用$inFn时传递它.

如果我们更换,

$inFn = function(...

$inFn = create_function(...

有没有(简单和干净)的方式做同样的事情?通过引用引用包含范围的变量,而不将它明确地传递给$inFn?

我遇到了 this answer to another question,这激发了我以下想法.我没有大量测试它,我确信它可以改进(并且执行程序调用的需要是一个耻辱),但它似乎解决了我的问题.
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_body)
    {   
        $inst = new self($use,$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,'<br>';

哪个返回:

06002

或者像这样:

function bar()
{           
    $x = 0;
    echo 'x is ','<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 ','<br>';
}       

bar();

哪个返回:

06004

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读