2012-04-06 13 views
5

¿Existe un método mágico que cuando se llama a un método determinado desde un objeto, se llama primero a un método mágico? Es como el método __call, pero esto solo se activa cuando no se encuentra el método.Método de ejecución (mágico) cuando se llama el método existente

Así que en mi caso me gustaría algo como esto:

class MyClass 
{ 
    public function __startMethod ($method, $args) 
    { 
     // a method just got called, so this is called first 
     echo ' [start] '; 
    } 

    public function helloWorld () 
    { 
     echo ' [Hello] '; 
    } 
} 

$obj = new MyClass(); 
$obj->helloWorld(); 

//Output: 
[start] [Hello] 

hace algo como esto existe en PHP ??

+1

Sólo se llamará '__construct' cuando se ejecutará esta parte del código:' $ obj = new MyClass(); ' – noob

+0

@micha, vea mi comentario en Stony --- (Se elimina el comentario) . No estoy buscando el método __construct(). Esto solo se llama cuando se crea el objeto. Necesito un método mágico que se llame cada vez que se llame a una función. – w00

+1

No, no hay. Declare sus métodos existentes con otro esquema o use un objeto contenedor. – mario

Respuesta

3

No hay una manera directa de hacerlo, pero me parece que está tratando de implementar un forma de programación orientada a Aspectos. Hay varias maneras de lograr esto en PHP, uno sería para configurar su clase algo como lo siguiente:

class MyClass 
{ 
    public function __startMethod ($method, $args) 
    { 
     // a method just got called, so this is called first 
     echo ' [start] '; 
    } 

    public function _helloWorld () 
    { 
     echo ' [Hello] '; 
    } 

    public function __call($method, $args) 
    { 
     _startMethod($method, $args); 
     $actualMethod = '_'.$method; 
     call_user_func_array(array($this, $actualMethod), $args); 
    } 
} 

$obj = new MyClass(); 
$obj->helloWorld(); 

Busque otras formas de implementar AOP en PHP para ver qué funciona mejor para usted (voy ver si puedo encontrar un enlace en alguna parte).

EDIT: he aquí un documento para que http://www.liacs.nl/assets/Bachelorscripties/07-MFAPouw.pdf

+0

Puede establecer '__startMethod' y' _helloWorld' como privados o protegidos, por lo que nadie lo "piratea". – Soaku

2

No, no hay un método mágico para esto.

lo mejor que podría hacer es crear otros nombres para sus funciones (por ejemplo: hidden_helloWorld), a continuación, coger toda las llamadas con __call y tratar de llamar al método hidden_ si está disponible. Por supuesto, esto solo es posible si tiene control total sobre el nombre de la clase y su elemento primario, etc.

1

que podría lograr que al hacer sus métodos privada y llamar a los métodos que utilizan la __call() método mágico. Me gusta:

<?php 

class MyClass{ 
    function __call($methd, $args){ 
     if(method_exists($this, $mthd)){ 
      $this->$mthd($args); 
     } 
    } 

    private function mthdRequired($args){ 
     //do something or return something 
    } 

No se llama al método mthdRequired, excepto al usar la llamada. Espero que esto sea útil.

+0

¡Una idea genial! –

Cuestiones relacionadas