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

2022-08-30 12:44:33

假设我有一个简单的类,比如:

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

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

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

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

编辑:我使用的是php 5.3。


答案 1

在 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);

答案 2