Php 如何取消对构造函数的引用?

Php 如何取消对构造函数的引用?,php,Php,理想情况下,我想做这样的事情 $formElement->addValidator ( (new RegexValidator('/[a-z]/') )->setErrorMessage('Error') // setErrorMessage() returns $this ); 当然PHP不允许这样,所以我接受了这个 $formElement->addValidator ( RegexValidator::create('/[a-z]/')->

理想情况下,我想做这样的事情

$formElement->addValidator
(
    (new RegexValidator('/[a-z]/') )->setErrorMessage('Error')
    // setErrorMessage() returns $this
);
当然PHP不允许这样,所以我接受了这个

$formElement->addValidator
(
    RegexValidator::create('/[a-z]/')->setErrorMessage('Error')
);
基类中的代码

static public function create( $value )
{
  return new static( $value );
}
class RegexValidator extends Validator
{

    public function __construct( $regex )
    {
    ....
}
我想更进一步,做一些像这样的事情

static public function create()
{
  return call_user_func_array( 'static::__construct', func_get_args() );
}
再说一遍,PHP不允许我这样做。我可以为每个验证器编写单独的“create”方法,但我希望它更流畅一些

有什么建议吗?

请使用以下网址:


科辛大量地给我指出了正确的方向,反思-(谢谢克日兹托夫)

请注意,后期静态绑定适用,这只是PHP>=5.3

感兴趣的方法是验证程序::create()。它提供了一种解决方法,解决了在bee以内联方式创建的对象上调用方法的能力不足的问题(请参见我的原始问题)

基类

class Validator
{
    ....
    static public function create()
    {
        $class = new ReflectionClass( get_called_class() );
        return $class->newInstanceArgs( func_get_args() );
    }

    public function setErrorMessage( $message )
    {
    ....
}
扩展类

static public function create( $value )
{
  return new static( $value );
}
class RegexValidator extends Validator
{

    public function __construct( $regex )
    {
    ....
}
一个使用示例

    $form
        ->getElement('slug')
        ->setLabel( 'Slug' )
        ->addValidator( RegexValidator::create('/[a-z]/')->setErrorMessage('Error') )
        ->addValidator( RequiredValidator::create() );

令人遗憾的是,有人强迫你使用一种与你的思维方式不符的语言。我建议使用一个临时变量,而不是伪Singelton/-Factorys,只是为了保存一行代码。@Kingcrunch是的,也许吧,但没有什么冒险,没有什么收获:)对于仍然回答这个问题的人,值得指出的是,PHP5.4确实支持@TomError首先需要的去引用构造函数语法。当我的8小时限制到期时,我会发布我的实际解决方案。哦,好吧,我要删除这篇帖子吗?@yes123:他提供了额外的信息和解决方案,我看不出有什么问题。不过,对代码再多解释一下就好了。@Bobby:除了包装在静态文件中的Cozin answer之外,我没有看到任何添加的代码method@yes123:我不同意,这不仅仅是容器类中的包装函数,它在类中的位置对类的用途和用法至关重要。@tom:这是唯一可以放入这两行代码的地方:D不管怎样,可以在这里留下它。你的答案得了+5分