PHP引用静态方法

时间:2011-08-27 17:50:39

标签: php class object doctrine symfony

我在我的项目中做了类似的事情:

use Doctrine\ORM\EntityRepository;

class ArticlesType extends AbstractType {
    static function statusFilter(EntityRepository $er) {
        return $er->createQueryBuilder('x')->where('x.status = 1');
    }


    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
                ->add('User', 'entity', array('class' => 'FP\MyBundle\Entity\Users',
#                                             'query_builder' => call_user_func(array('self','statusFilter'), ??)
                                              'query_builder' => function(EntityRepository $er) { return ArticlesType::statusFilter($er); }
                                             ))
    }
}

关于如何对statusFilter方法进行“更好”调用的任何想法?

正如您所看到的,我尝试使用call_user_func,但我不知道要传递给哪个参数

感谢

2 个答案:

答案 0 :(得分:1)

您可以使用

self::statusFilter($er);

或者,您可以使用

call_user_func(array('self', 'statusFilter'), $er);

我现在更好地理解这个问题。正如@igorw所说,Symfony期待关闭;但是,这并不意味着它不能写得更好。

您可以创建自定义帮助程序,然后在buildFom调用中使用它。

function funcRef($func){
  return create_function('', "return call_user_func_array('{$func}', func_get_args());");
}

然后你可以在buildForm方法中使用它:

'query_builder' => funcRef("ArticlesType::statusFilter")

see it working here on tehplayground.com

答案 1 :(得分:0)

没有。 Symfony\Bridge\Doctrine\Form\Type\EntityType使用query_builder选项并将其传递给Symfony\Bridge\Doctrine\Form\ChoiceList\EntityChoiceList

查询构建器需要是Doctrine\ORM\QueryBuilder的实例或Closure(匿名函数)。

此外,macek建议的call_user_func在大多数情况下都可以使用,但它在闭包中不起作用,因为它具有不同的范围。这可以在PHP 5.4中解决,但是现在它根本不起作用。

我会像你一样,使用闭包并从中调用静态方法。

编辑:你最初尝试做的事情也不会起作用,因为在这种情况下你将会调用静态方法。这不是你想要的。你想要的是传递一个函数,该函数将在以后的某个时间调用。