Вызывать методы объектов в массиве используя array_map? - PullRequest
30 голосов
/ 27 июля 2011

Предположим, у меня есть простой класс, такой как:

class MyClass {
  private $_prop;
  public function getProp() {return $this->_prop;}
  [....]
}

Теперь, что я хочу сделать где-то вне области действия MyClass, это получить массив $ _prop из массива объектов MyClass ($objs).Это, конечно, можно сделать с помощью кода, подобного следующему:

$props = array();
foreach ($objs as $obj) {
    $props[] = $obj->getProp();
}

Однако для этого нужно взять несколько строк, особенно если они сформированы таким образом (и я должен использовать такое форматирование).Итак, вопрос: возможно ли это сделать с помощью array_map?Одним из способов было бы использовать функцию создания, но мне не очень нравится это в php (лямбды в php по крайней мере неудобны, и если я правильно понимаю, их производительность подобна производительности уклоненного кода, но производительность здесь не имеет значения).Я устал немного искать и не смог найти никакого определенного ответа.Но у меня вроде есть ощущение, что это невозможно.Я пробовал что-то вроде array_map(array('MyClass', 'getProp'), $objs), но это не работает, поскольку метод не является статичным.

Редактировать: я использую php 5.3.

1 Ответ

28 голосов
/ 27 июля 2011

В PHP 5.3 вы можете сделать:

$props = array_map(function($obj){ return $obj->getProp(); }, $objs);

(см. анонимные функции )

Конечно, это все равно будет медленнее, чем использование цикла for, поскольку у вас есть один вызов функции на элемент, но я думаю, что это ближе всего к тому, что вы хотите.

В качестве альтернативы, которая также работает до 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);
...