2011-06-06 6 views
11

¿Existe la posibilidad de configurar una clase para que, si no se define un método, en lugar de arrojar un error, vaya a una función catch-all?Método de PHP - catchall en una clase

tal que si llamo a $myClass->foobar(); pero foobar nunca se configuró en la definición de clase, algún otro método lo manejará?

Respuesta

15

sí, es overloading:

class Foo { 
    public function __call($method, $args) { 
     echo "$method is not defined"; 
    } 
} 

$a = new Foo; 
$a->foo(); 
$b->bar(); 

A partir de PHP 5.3, también puede hacerlo con métodos estáticos:

class Foo { 
    static public function __callStatic($method, $args) { 
     echo "$method is not defined"; 
    } 
} 

Foo::hello(); 
Foo::world(); 
+1

+1 Para agregar, es * sobrecarga PHP *, que es (inexplicablemente) un uso diferente del término que otros lenguajes OOP. – webbiedave

1

Magic methods. En particular, __call().

+0

__invoke es algo diferente a __call. – akond

+0

__invoke sería la respuesta si @changokun quisiera hacer '$ myclass();' –

+0

@akond: Ciertamente, era una falta mental que ya he solucionado. –

6

Sí, puede utilizar el método mágico __call que se invoca cuando no se encuentra un método adecuado. Ejemplo:

class Foo { 
    public function __call($name, $args) { 
     printf("Call to %s intercepted. Arguments: %s", $name, print_r($args, true)); 
    } 
} 

$foo = new Foo; 
$foo->bar('baz'); // Call to bar intercepted. Arguments: string(3) 'baz' 
Cuestiones relacionadas