tags:

views:

78

answers:

3

Hi,

i have a validation class which needs improving. If I require some custom validation I need to specify a custom function. It works a bit like this:

  1. The controller tells the validation that a custom validation function is required.
  2. The controller runs the validation.
  3. --- Gets iffy here ---
  4. Validation class creates a new instance of the controller class....
  5. Validation class runs controller->custom_validation_function()
  6. Validation class returns true / false

Is there someway that I can alter this to do something like this?

$validation = new validation;
// Insert rules here.
$validation->function() = $this->function();

By doing this I could get rid of the step of creating an unneeded class instance.

+1  A: 

PHP doesn't really support monkeypatching, but you could create either a subclass and use that as your $validation object (this is the way I would do it). Or you could figure out a way to use __call to do it: http://php.net/manual/en/language.oop5.overloading.php

SeanJA
+4  A: 

You will want to use a Strategy Pattern. Have a Validator class for each validation you want to do and then instantiate this class in the consuming class as needed. Then delegate the validation to the validator instance.

Have a look at how Zend Framework does it for an idea.
Also see the example given in my answer to this related question:

Gordon
Oh, that works too...
SeanJA
A: 

Checkout the delegates example at phpclasses.com.

$processruns->add(function() { echo "hello"; });
$processruns->add(function() { echo "world"; }); 

Also, this discussion might help.

KMan
But can you call `$this` from those functions?
SeanJA
@SeanJA: Haven't used it though, but I suppose you can call it like `$processruns->add(function() { $this->yourfunction(); });`
KMan