地狱,我什至无法在 PHP 网站上找到“使用”的文档(除了在命名空间的上下文中 - 很好地混淆了关键字 BTW)。
有人可以确认function() use ($foo) { }
仅在 5.3 及更高版本中可用吗?你在哪里找到记录的?
作为一个额外的好处,你将如何编码不能使用'use'(例如:使用create_function($args,$funcname)作为array_map()的回调)?
闭包是在 5.3 中引入的,因此use
在 5.3 或更高版本中也可以与闭包一起使用(当然)。
作为额外的奖励,您将如何编码无法在闭包中使用“使用”
我不完全理解这个问题,但是因为闭包和use
with 闭包都带有相同的版本,所以没有不能使用use
with 闭包的情况。要么两者都有,要么什么都没有(--> <5.3)
在没有闭包的情况下,在 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)。
希望这对某人有用。在某一点。也许。