どちらの匿名関数も、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
2 つのメンバーを持つ の形式で記述されます。最初のメンバーはオブジェクト インスタンスで、2 番目のメンバーはオブジェクト メソッドの名前です。
当然、これを拡張してマッピング関数をマッピング オブジェクトに入れることができるので、より簡単になります。
class MapObj
{
...
public function map(array $order) {
$callback = array($this, 'callback');
return array_map($callback, $order);
}
}
新しい使い方:
$map = new MapObj($data);
$sorted = $map->map($order);
ご覧のとおり、これにより、使用法がもう少し簡単になります。正直に言うと、私のメソッドの命名法はここではそれほど素晴らしいものではありません。そのため、改善の余地を残しておきます。
もう 1 つの利点は、コールバック メソッドの可視性を非公開にできることです。
コールバックで使用するデータをパラメーターとしてマッピング関数に渡す状況。それは、利用したいクラスがすでにあると書いたからですが、コンストラクターに触れることはできません。したがって、与えられた例は少し短いです。
コンストラクターを使用しない別の例を次に示します。削除しました。
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);
ご覧のとおり、プライベート メンバー変数を設定する方法はユーザー次第です。仕事に合ったことをする。