这两个匿名函数都使用该use
子句将变量传递到本地范围。
您可以使用对象方法实现相同的目的,其中对象具有这些变量作为属性。
在对象方法中,您可以访问这些。
$sorted = array_map(function($v) use ($data) {
return $data[$v - 1];
}, $order);
示例性映射对象可能如下所示:
class MapObj
{
private $data;
public function __construct($data) {
$this->data = $data;
}
public function callback($v) {
return $this->data[$v - 1];
}
}
如您所见,它具有相同的功能,但只是用 PHP 5.2 语法编写的。
它的用法:
$map = new MapObj($data);
$callback = array($map, 'callback');
$sorted = array_map($callback, $order);
这就是它的工作原理。对象方法的回调总是以array
带有两个成员的形式编写,第一个是对象实例,第二个是对象方法的名称。
当然,您可以将其扩展为将映射函数放入映射对象中,因此更直接:
class MapObj
{
...
public function map(array $order) {
$callback = array($this, 'callback');
return array_map($callback, $order);
}
}
新用法:
$map = new MapObj($data);
$sorted = $map->map($order);
如您所见,这可能会使用法更直接。我必须承认,我的方法命名在这里并不是很出色,所以我为您的改进留出了一些空间。
另一个好处是,您可以将回调方法的可见性设为私有。
在回调中将要使用的数据作为参数传递给映射函数的情况。那是因为你写了你已经有一个你想使用的类,但是你不能触摸构造函数。所以给定的例子有点短。
这是另一个不使用构造函数的示例,我将其删除:
class MyObj
{
private $data;
private function callback($v) {
return $this->data[$v - 1];
}
public function map($order, $data) {
$callback = array($this, 'callback');
$this->data = $data;
return array_map($callback, $order);
}
}
如您所见,不再需要构造函数来传递$data
,而是将其map()
作为附加参数传递给方法。用法:
$myObj = new MyObj(....); // somewhere.
// later on:
$myObj->map($order, $data);
// could be also:
$this->map($order, $data);
如您所见,如何设置私有成员变量取决于您。做适合工作的事情。