假设我们有一个表示知道其名称的实体的类:
class Entity
{
private $name;
public function __construct(string $name) { $this->name = $name; }
public function getName() :string { return $this->name; }
}
,我们有一系列这样的实体:
$entities = [ new Entity('Alice'), new Entity('Bob') ];
我们真正想要的是它们的名称数组,因此我们使用array_map
函数:
$names = array_map(
function($entity) { return $entity->getName(); },
$entities
);
但是,即使我从闭包中删除了类型提示,但语法对我来说仍然显得庞大,尤其是在了解[ $object, 'methodName' ]
闭包语法的情况下。
有没有一种方法可以简化array_map的构造?
答案 0 :(得分:2)
你的东西对我来说还可以。
唯一可能的解决方案是使用array_column()
,但是只有将name
声明为public
时,该方法才有效:
(PHP版本> = 7.0)
<?php
class Entity
{
public $name = 'Alice';
public function __construct(string $name) { $this->name = $name; }
};
$entities = [ new Entity('Alice'), new Entity('Bob') ];
var_dump(array_column($entities, 'name'));
输出
array(2){
[0] =>
string(5)“爱丽丝”
[1] =>
string(3)“鲍勃”
}
答案 1 :(得分:1)
目前没有更短的语法。有两个RFC(https://wiki.php.net/rfc/arrow_functions,https://wiki.php.net/rfc/short-closures)想要引入简短的闭包,但它们仍处于草稿阶段,很难在php中获得此类功能的2/3多数。在不久的将来,我不希望他们会以这种语言出现。
如果在这种情况下需要更简洁的语法,则可以创建自己的lambda生成器。
function getPropertyLambda($property) {
return function($item) use ($property) {
return $item->{'get' . ucfirst($property)}();
};
}
$names = array_map(getPropertyLambda("name"), $entities);