1

地狱,我什至无法在 PHP 网站上找到“使用”的文档(除了在命名空间的上下文中 - 很好地混淆了关键字 BTW)。

有人可以确认function() use ($foo) { }仅在 5.3 及更高版本中可用吗?你在哪里找到记录的?

作为一个额外的好处,你将如何编码不能使用'use'(例如:使用create_function($args,$funcname)作为array_map()的回调)?

4

2 回答 2

2

闭包是在 5.3 中引入的,因此use在 5.3 或更高版本中也可以与闭包一起使用(当然)。

作为额外的奖励,您将如何编码无法在闭包中使用“使用”

我不完全理解这个问题,但是因为闭包和usewith 闭包都带有相同的版本,所以没有不能使用usewith 闭包的情况。要么两者都有,要么什么都没有(--> <5.3)

http://php.net/functions.anonymous

发行说明 5.3.0

于 2011-06-14T17:26:10.207 回答
1

在没有闭包的情况下,在 5.3 之前的世界中,如果您想避免 create_function() 但需要将变量从外部范围绑定到回调类型函数,请将函数包装在一个类中,然后将外部变量传递给该类实例化。

如果您经常这样做,您可能会发现以下通用包装类很有用(或丑陋,或两者兼而有之):

class GenericCallbackWrapper {
    function __construct (){
        $argIndex = 1;
        foreach(func_get_args() as $value){
            $argName = 'user' . $argIndex;
            $this->$argName = $value;
        }
    }

    public function example_strip_prefix($a){
        return substr($a, strlen($this->user1));
    }
}

我实际上会把它放在一个外部文件(callbacks.php)中,然后继续将你的回调代码添加到这个类的公共方法中。显然,如果您要经常这样做,这只会带来好处。否则,只需创建一个一次性包装类,其构造函数接受您要包含的特定数量的参数。

然后可以使用两个参数形式来利用此通用代码来指定回调:

function get_input_field_IDs_by_prefix($prefix){
    return array_map(
        array(new GenericCallbackWrapper($prefix), 'example_strip_prefix'),
        preg_grep('/^'.$prefix.'/', array_keys($_REQUEST))
    );
}

通用包装器接受任意数量的参数并将它们作为成员(实例)变量添加到类中,然后可以按 $this->user1、$this->user2 等顺序访问该类(初始索引为 1)。

希望这对某人有用。在某一点。也许。

于 2011-06-14T18:26:24.203 回答