使用array_map调用数组中对象的方法?

时间:2011-07-27 06:53:23

标签: php arrays object methods 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来做到这一点?一种方法是使用create function,但我真的不喜欢它在php中(php中的lambdas至少很尴尬,如果我理解正确,它的性能就像是evaled代码的表现,但性能不是这里的重点)。我已经厌倦了搜索,但没有找到任何定义性的答案。但我有点觉得这是不可能的。我试过像array_map(array('MyClass', 'getProp'), $objs)这样的东西,但这不起作用,因为方法不是静态的。

编辑:我正在使用php 5.3。

1 个答案:

答案 0 :(得分:28)

在PHP 5.3中,你可以这样做:

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

(请参阅anonymous functions

当然,这仍然比使用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);
相关问题