理想情况下,我想做这样的事情......
$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不允许我这样做。我可以为每个验证器编写单独的'创建'方法,但我希望它更加光滑。
有什么建议吗?
答案 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);