使用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(...) 的数组?