あなたが正しく理解していれば、異なる特性を動的に実装したいと考えるValidator
クラスがあります。これは、形質がデザインされたものではありません。
特性は、同じクラスを拡張することなく、異なるクラス間で共通の機能を共有するためのものです。むしろあなたがしたいことは、それぞれの特性をインターフェースを実装するスタンドアローンのクラスにすることです。それであなたはValidator
クラスに渡すことができます。
これは次のようになります。この場合
interface ValidatorMethod {
public function validate($input);
}
class NumberValidator implements ValidatorMethod {
public function validate($input) {
return is_numeric($input);
}
}
class IntegerValidator implements ValidatorMethod {
public function validate($input) {
return is_integer($input);
}
}
class Validator {
private $validators = [];
public function addValidator (ValidatorMethod $method) {
$validators[] = $method;
}
public function validate($input) {
foreach ($validators as $validator) {
if (!$validator->validate($input)) {
return false;
}
}
return true;
}
}
は、あなたは彼らが正しく渡すことを確認するためにValidatorMethod
オブジェクトのそれぞれについて、個々のテストを記述します。 Validator
クラスについては、必要に応じて合格し、失敗する模擬ValidatorMethod
でテストを書くことになります。たとえば、以前のものの合格/不合格に関係なく、すべてのバリデーターを実行させたい場合。
テストがそうのようになります。
class ExampleValidatorMethodTest {
public function testValidatePass() {
$method = new NumberValidator();
$this->assertTrue($method->validate(1));
}
}
class ValidatorTest {
public function testSingleMethod() {
$method = $this->getMockBuilder('ValidatorMethod')
->getMock();
$input = 'foo';
$method->expects($this->once())
->with($input);
->will($this->returnValue(True));
$validator = new Validator();
$validator->addValidator($method);
$this->assertTrue($validator->validate($input));
}
public function testMultipleMethods() {
$method1 = $this->getMockBuilder('ValidatorMethod')
->getMock();
$method2 = $this->getMockBuilder('ValidatorMethod')
->getMock();
$input = 'foo';
$method1->expects($this->once())
->with($input);
->will($this->returnValue(True));
$method2->expects($this->once())
->with($input);
->will($this->returnValue(True));
$validator = new Validator();
$validator->addValidator($method1);
$validator->addValidator($method2);
$this->assertTrue($validator->validate($input));
}
}
あり、コードを簡単にするためのテストで行うことができますいくつかの最適化がありますが、例はちょうどあなたが探しているものの考え方にを与えることです行う。