クラスは、自分自身を検証するなどのことを行う特殊な型と見なすことができます。
abstract class ValidatingType
{
protected $val;
public function __construct($val)
{
if(!self::isValid($val))
{ // complain, perhaps by throwing exception
throw new Exception("No, you can't do that!");
}
$this->val = $val;
}
abstract static protected function isValid($val);
}
ValidatingType を拡張して、検証型を作成します。そのため、isValid メソッドを作成する必要があります。
class ValidatingNumber extends ValidatingType
{
...
static protected function isValid($val)
{
return is_numeric($val);
}
}
class ValidatingPrimeNumber extends ValidatingNumber
{
/*
* If your PHP doesn't have late-binding statics, then don't make the abstract
* or overridden methods isValid() static.
*/
static protected function isValid($val)
{
return parent::isValid($val)
or self::isPrime($val); // defined separately
}
}
class ValidatingImage extends ValidatingType
{
...
static protected function isValid($val)
{
// figure it out, return boolean
}
}
このアプローチの利点の 1 つは、新しい検証型を作成し続けることができ、バルーニング Is クラスを取得しないことです。
このアプローチには、より洗練されたバリエーションがあります。これは単純なバリエーションです。構文をクリーンアップする必要がある場合があります。