这两个匿名函数都使用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);
正如你所看到的,你如何设置私有成员变量取决于你。做适合的工作。
anon funcs是在5.3中添加的,所以是的,你是对的......不支持:http://php.net/manual/en/functions.anonymous.php。通过使用通常定义的常规功能来解决这个问题。 'usort($ items,“your_func_here”)'。 –
谢谢 - 问题是我真的不知道匿名函数是如何工作的。例如,我无法弄清变量$ a,$ b和$ v是如何使用的。他们来自哪里? –
将函数声明为常规函数,并将其作为字符串传递。 – meagar