這兩個匿名函數都使用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