PHP对静态方法的引用

PHP对静态方法的引用,php,class,object,doctrine,symfony,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 functi

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

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\u user\u func尝试了一下,但我不知道要传递给它哪个参数

谢谢

您可以使用

self::statusFilter($er);
call_user_func(array('self', 'statusFilter'), $er);
或者,您可以使用

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")

否。
Symfony\Bridge\document\Form\Type\EntityType
接受
query\u builder
选项并将其传递给
Symfony\Bridge\document\Form\ChoiceList\EntityChoiceList

查询生成器需要是
原则\ORM\QueryBuilder
的实例或
闭包
(匿名函数)

另外,在大多数情况下,
macek
所建议的调用_user_func会起作用,但在闭包中不会起作用,因为它的作用域不同。这可能在PHP5.4中得到解决,但目前它根本不起作用

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


EDIT:而且您最初尝试做的也不会起作用,因为在这种情况下,您已经在调用静态方法了。那不是你想要的。您想要的是传递一个函数,该函数将在以后某个时间点调用。

我没有得到的是这个$er变量/它似乎不“存在”(即,我无法将其传递给函数,但当我执行函数(EntityRepository$er)时,它“出现”