次のような単純なクラスがあるとします。
_class MyClass {
private $_prop;
public function getProp() {return $this->_prop;}
[....]
}
_
MyClass
のスコープ外の場所で実行したいのは、MyClass
(_$objs
_)のオブジェクトの配列から$ _propの配列を取得することです。もちろん、これは次のようなコードで実行できます。
_$props = array();
foreach ($objs as $obj) {
$props[] = $obj->getProp();
}
_
ただし、これは、特にこの方法でフォーマットされた場合、いくつかの行を引用します(そして、私はそのようなフォーマットを使用する必要があります)。だから質問は:array_mapを使用してこれを行うことが可能かどうかです。 1つの方法はcreate関数を使用することですが、phpではあまり好きではありません(phpのlambdaは少なくとも厄介で、私が正しく理解していれば、そのパフォーマンスは評価されたコードのパフォーマンスと似ていますが、パフォーマンスはここのポイントの横にあります)。私はかなりの検索に疲れていて、明確な答えを見つけることができませんでした。でも、それは不可能だと感じています。私はarray_map(array('MyClass', 'getProp'), $objs)
のようなものを試しましたが、メソッドは静的ではないので機能しません。
編集:私はphp 5.3を使用しています。
PHP 5.3では、次のことができます。
$props = array_map(function($obj){ return $obj->getProp(); }, $objs);
( 無名関数 を参照)
もちろん、これはfor
ループを使用するよりも低速ですが、要素ごとに1つの関数呼び出しがあるためです。
または、PHP 5.3より前のバージョンでも機能し、スタイルガイドラインによりよく適合する場合があります。
function map($obj) {
return $obj->getProp();
}
$props = array_map('map', $objs);
または(PHP 5.3に戻って)、次のようなラッパー関数を作成できます(ただし、これは私が考える最も遅い可能性です):
function callMethod($method) {
return function($obj) use ($method) {
return $obj->{$method}();
};
}
$props = array_map(callMethod('getProp'), $objs);