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

mor*_*les 32 php arrays methods object array-map

假设我有简单的类:

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

现在我想要做的不是在范围内的MyClasssom是从MyClass($objs)的对象数组中获取$ _prop的数组.这当然可以用这样的代码完成:

$props = array();
foreach ($objs as $obj) {
    $props[] = $obj->getProp();
}
Run Code Online (Sandbox Code Playgroud)

然而,这需要引用一些行,特别是当以这种方式格式化时(我必须使用这种格式).所以问题是:如果可以使用array_map来做到这一点?一种方法是使用create function,但我真的不喜欢它在php中(php中的lambdas至少很尴尬,如果我理解它的性能就像evaled代码那样,但性能不在这里).我已经厌倦了搜索,但没有找到任何定义性的答案.但我有点觉得这是不可能的.我尝试了类似的东西array_map(array('MyClass', 'getProp'), $objs),但这不起作用,因为方法不是静态的.

编辑:我正在使用php 5.3.

Fel*_*ing 30

在PHP 5.3中,您可以:

$props = array_map(function($obj){ return $obj->getProp(); }, $objs);
Run Code Online (Sandbox Code Playgroud)

(参见匿名函数)

当然,这仍然比使用for循环慢,因为每个元素有一个函数调用,但我认为这最接近你想要的.

或者,它也适用于PHP 5.3之前,可能更符合您的风格指南:

function map($obj) {
    return $obj->getProp();
}

$props = array_map('map', $objs);
Run Code Online (Sandbox Code Playgroud)

或者(再次回到PHP 5.3)你可以像这样创建一个包装器函数(但这是我认为最慢的可能性):

function callMethod($method) {
    return function($obj) use ($method) {
        return $obj->{$method}();
    };
}

$props = array_map(callMethod('getProp'), $objs);
Run Code Online (Sandbox Code Playgroud)

  • 如果对象不是`MyClass`的实例,你甚至可以输入提示闭包参数来触发致命错误,例如`function(MyClass $ obj){...` (4认同)
  • @morphles:嗯,在你的评论中,你说你喜欢功能方法,但现在你说你没有排队匿名功能.但是它们是一对一的.正如我在评论中所说,我会选择`for`循环. (3认同)