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

使用真正的关闭,我们可以做,
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

相关文章

Hessian开源的远程通讯,采用二进制 RPC的协议,基于 HTTP 传输。可以实现PHP调用Java,Python,C#等多语...
初识Mongodb的一些总结,在Mac Os X下真实搭建mongodb环境,以及分享个Mongodb管理工具,学习期间一些总结...
边看边操作,这样才能记得牢,实践是检验真理的唯一标准.光看不练假把式,光练不看傻把式,边看边练真把式....
在php中,结果输出一共有两种方式:echo和print,下面将对两种方式做一个比较。 echo与print的区别: (...
在安装好wampServer后,一直没有使用phpMyAdmin,今天用了一下,phpMyAdmin显示错误:The mbstring exte...
变量是用于存储数据的容器,与代数相似,可以给变量赋予某个确定的值(例如:$x=3)或者是赋予其它的变...