如何取消引用构造函数?

时间:2011-07-14 08:01:39

标签: php

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

$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 );
}

我会喜欢更进一步做这样的事情......

static public function create()
{
  return call_user_func_array( 'static::__construct', func_get_args() );
}

同样,PHP不允许我这样做。我可以为每个验证器编写单独的'创建'方法,但我希望它更加光滑。

有什么建议吗?

2 个答案:

答案 0 :(得分:9)

Corzin大力指出我正确的方向,反思 - (谢谢Krzysztof)。

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

的一项功能

感兴趣的方法是 Validator :: create()。它提供了一种解决方法,因为缺乏在内联创建的对象上调用方法的能力(参见我原来的问题)。

基类...

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

    public function setErrorMessage( $message )
    {
    ....
}

扩展班......

class RegexValidator extends Validator
{

    public function __construct( $regex )
    {
    ....
}

用法示例......

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

答案 1 :(得分:8)

使用ReflectionClass::newInstanceArgs中的Reflection API

$class = new ReflectionClass(__CLASS__);
return $class->newInstanceArgs($args);