Interesante método que se utiliza mucho en .NET, que permite extender los métodos de una clase usando la definición de métodos estáticos de una clase extendida de la primera. El proceso es sencillo, se utiliza el método __call y se obtiene una lista de clases definidas y se compara la clase actual por cada una de las definidas y si contiene el método y es derivada de ella, se ejecuta la llamada:
public function __call($functionName, $arguments = array()) {
// Add an extra parameter
array_unshift($arguments, $this);
// Current reflected class
$reflectedClass = new reflectionObject($this);
// Find suitable class and function
$availableClasses = get_declared_classes();
foreach ($availableClasses as $class) {
$classDefinition = new ReflectionClass($class);
$availableMethods = $classDefinition->getMethods();
foreach ($availableMethods as $method) {
if ($method->isStatic() && $method->getName() == $functionName) {
$availableParameters = $method->getParameters();
if ($availableParameters[0]->getClass()->getName() == $reflectedClass->getName()) {
$method->invokeArgs(null, $arguments);
}
}
}
}
}
Extension methods for PHP
Vía / PHPDeveloper.org