【问题标题】:Calling all the getters from an entity从一个实体中调用所有的 getter
【发布时间】:2015-08-20 15:33:44
【问题描述】:

使用后:

$queryResult = 
    $this
        ->getDoctrine()
        ->getRepository('EtecsaAppBundle:Paralizacion')
        ->createQueryBuilder('e')
        ->getQuery();
        ->setDQL($myOwnQuery)
        ->getResult();

我有一个实体数组,我想使用它们的所有属性获取器。我这样做是这样的:

foreach ($queryResult as $index => $itemEntity)
{
    $objWorksheet->SetCellValue('A'. ($index + 17 ), $index + 1);
    // ... The itemEntity class has entity relationships associations 
    $objWorksheet->SetCellValue('B'. ($index + 17 ), $itemEntity->getSomeRelatedProperty()->getSomeProperty());
    // ... it also has properties with several types (date, string, etc)
    $objWorksheet->SetCellValue('C'. ($index + 17 ), $itemEntity->getSomeProperty));
    // Also some of the values obtained from his respective getter require some processing
    $objWorksheet->SetCellValue('D'. ($index + 17 ), getProcessedValue($itemEntity->getSomeSpecificProperty));
}

SetCellValue 函数中使用的字母也会增加。我以此为例。 有没有办法动态调用实体的所有getter,就不用一一调用了?例如这样的事情:

foreach ($queryResult as $index => $itemEntity)
{
    $columnLetter = 'A';
    $objWorksheet->SetCellValue($columnLetter++ . ($index + 17 ), $index + 1);

    arrayOfGetters = getArrayOfGetters(itemEntity);
    foreach (arrayOfGetters as $getterMethod)
    {
        // properties that reference an entity relationship association would have the __ToString function
        $objWorksheet->SetCellValue($columnLetter++ . ($index + 17 ), /* get value of getterMethod */);
    }
}

【问题讨论】:

  • 问题是?
  • @JovanPerovic 对不起...我要求一种方法来动态调用实体的所有 getter,所以我不必一个一个调用它们
  • 我认为人们对您的问题投了反对票,因为它有点含糊。我认为根据标题(因此我提交的答案),您问题的症结很清楚,但是以下“SetCellValue 函数中使用的字母也会增加”是问题的一部分吗?如果是这样,请澄清,我会尝试相应地更新我的答案。
  • 感谢@Darragh 的回答,我刚刚更新了我的问题,以显示我想要在这里实现的目标。我想我可以很好地利用你的答案。

标签: php symfony dynamic call getter


【解决方案1】:

这是一个 PHP 通用的答案,应该适用于您的情况。试试这个:

<?php

class Entity
{
    public function setFoo($foo)
    {
        $this->foo = $foo;
    }

    public function getFoo()
    {
        return $this->foo;
    }
}


$entity = new Entity();
$entity->setFoo('foo!');

$getters = array_filter(get_class_methods($entity), function($method) {
    return 'get' === substr($method, 0, 3);
});

var_dump($getters);

给定任何普通的旧 PHP 对象,您可以使用 get_class_methods() 获取对象上所有方法的列表,这些方法在调用 get_class_methods() 的范围内可见 - 在本例中为所有 public 方法。

然后我们过滤这个值数组,只返回 getter。

对于上面的例子,这会产生:

array(1) {
  [1] =>
  string(6) "getFoo"
}

现在您可以动态调用您的 getter,如下所示:

foreach ($getters as $getter) {
    echo $entity->{$getter}(); // `foo!`
}

希望这会有所帮助:)

【讨论】:

  • 需要注意的一点:afaik,get_class_methods() 也会返回静态方法的名称。在您的情况下可能不是问题,因为您不太可能拥有静态 getter 和 setter。但值得指出!
  • 一个问题@Darragh 我在哪里可以得到一些关于在这个$entity-&gt;{$getter}() 上使用 {} 的信息
  • 嗨,实际上,在这种情况下,它完全是多余的,所以你可以使用 $entity-&gt;$getter() 代替。实际上,我打算将其编辑出来,但后来我想它可能说明您可以使用字符串值作为对象上可调用对象的占位符。有时人们看不到-&gt;$ :)
  • 无论如何,您都可以在Strings documentation 中找到更多信息。寻找标题 Complex (curly) syntax(没有页面锚,这让我对 PHP 的文档感到厌烦)。它提供了一些{$myvar} 语法“允许使用复杂表达式”的示例。重申一下,由于函数和方法名称的语法规则,这里实际上是完全多余的,所以请随意删除它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多