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

Posted

技术标签:

【中文标题】使用array_map调用数组中对象的方法?【英文标题】:Call methods of objects in array using array_map? 【发布时间】:2011-10-14 00:08:01 【问题描述】:

假设我有一个简单的类:

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 函数,但我不太喜欢在 php 中这样做(php 中的 lambdas 至少很尴尬,如果我理解正确,它的性能就像 evaled 代码的性能一样,但性能在这里无关紧要)。我已经厌倦了搜索,未能找到任何明确的答案。但我有种感觉,这是不可能的。我尝试了array_map(array('MyClass', 'getProp'), $objs) 之类的方法,但由于方法不是静态的,所以这不起作用。

编辑:我使用的是 php 5.3。

【问题讨论】:

foreach 循环有什么问题?它只有四行代码。您使用的是哪个 PHP 版本? 只是 array_map 有可能变得更干净,而且我喜欢函数式技术。但是当然 php 不是一种函数式语言,所以......如果可以做到这一点,它仍然会很酷。因为在现实中,语言拥有的功能似乎有点微不足道。 究竟有什么更清洁的?您将数组的内容一一传递给回调。这与 Ruby、Python 和 javascript 几乎相同。 伪代码array_map(array('MyClass', 'getProp'), $objs) 将调用非静态方法会更干净。一条紧凑的生产线。无需创建空数组。无需手动循环并将对象推送到数组上。只需给一个数组并拿另一个数组。当然,这个想法不能很好地与 oop 和 esp 以及 php 使用的动态丢失类型一起玩......但它仍然可以做到:) 但这不是array_map 所做的。它对数组中的每个 $element 执行callback($element)。你描述的应该是$element->callback() 【参考方案1】:

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

【讨论】:

如果对象不是MyClass 的实例,您甚至可以键入提示闭包参数以触发致命错误,例如function(MyClass $obj)... 闭包只在传递给array_map()时创建一次。猜测一下,我会说这在性能方面几乎与循环相同 我说我不想要 lambda/匿名函数。除此之外,我认为我很可能无法根据编码风格指南编写此代码。 @morphles:嗯,在您的评论中您说您喜欢函数式方法,但现在您说您不使用匿名函数。但他们手牵手。正如我在评论中所说,我只会使用for 循环。 @morphles:PHP 为我们提供了许多小函数,它们可以组装成新的更强大的函数。就是这样。这不是 Python。

以上是关于使用array_map调用数组中对象的方法?的主要内容,如果未能解决你的问题,请参考以下文章

警告:count():参数必须是一个实现Countable的数组或对象(在数组中是多维的)

如何在 PHP 中使用带有 array_map(...) 的数组?

如何在PHP中将数组元素转换为字符串?

laravel array_map 得到错误“array_map(): 参数 #2 应该是一个数组”

php array_map与array_walk使用对比

array_map常用技巧