web-dev-qa-db-ja.com

array_mapを使用して配列内のオブジェクトのメソッドを呼び出しますか?

次のような単純なクラスがあるとします。

_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を使用しています。

33
morphles

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);
29
Felix Kling