2011-08-11 25 views
16

Estoy intentando agregar métodos dinámicamente desde archivos externos. Ahora tengo el método __call en mi clase, así que cuando llamo al método que quiero, __call lo incluye para mí; el problema es que quiero llamar a la función cargada usando mi clase, y no quiero la función cargada fuera de la clase;Cómo agregar métodos dinámicamente

Class myClass 
{ 
    function__call($name, $args) 
    { 
     require_once($name.".php"); 
    } 
} 

echoA.php:

function echoA() 
{ 
    echo("A"); 
} 

entonces yo quiero usarlo como:

$myClass = new myClass(); 
$myClass->echoA(); 

Cualquier consejo será apreciado.

+0

Desde el php [Manual] (http://www.php.net/manual/functions.user-defined.php): *" ... Todas las funciones y clases en PHP tienen el alcance global. .. "*. Por lo menos al menos: * "... y no quiero una función cargada fuera de la clase; ..." * no será posible. – Yoshi

+0

Esto suena como una mala idea ... – deceze

+0

@Yoshi creo que no explique bien, cuando incluyo el archivo que contiene la función, se puede llamar a cualquier lugar, como: echoA(); en lugar de $ myClass-> echoA(); –

Respuesta

0

A lo que se refiere se llama Sobrecarga. Leer todos los detalles en el PHP Manual

2

Si leo el derecho manual, la __call ser llamado insted de la función, si la función dosn't existen por lo que necesitan probely llamarlo después de lo creó

Class myClass 
{ 
    function __call($name, $args) 
    { 
     require_once($name.".php"); 
     $this->$name($args); 
    } 
} 
+2

No puede agregar métodos a las clases php durante la ejecución. – Yoshi

+0

intenté esto hace 2 horas, no podemos agregar método al incluir un archivo que contiene función (es), es por eso que hice esta pregunta;) –

+0

Creo que esta podría ser la respuesta válida, además de la forma require_once para llamar a la función dinámica no no parece el camino a seguir. Estoy creando un método sobre la marcha condicionalmente utilizando el método mágico __call. –

12

no puede agregar dinámicamente métodos a una clase en tiempo de ejecución, y punto. *
PHP simplemente no es una muy duck-punchable idioma.

* Sin ugly hacks.

-3

He trabajado con el siguiente ejemplo de código y un método de ayuda que funciona con __call que puede ser útil. https://github.com/permanenttourist/helpers/tree/master/PHP/php_append_methods

+3

Tenga en cuenta que [las respuestas solo de enlace] (http://meta.stackoverflow.com/tags/link-only-answers/info) no se recomiendan, por lo que las respuestas deberían ser el punto final de una búsqueda de una solución (vs. otra escala más de referencias, que tienden a quedar obsoletas en el tiempo). Considere agregar una sinopsis independiente aquí, manteniendo el enlace como referencia. – kleopatra

+0

El enlace está desconectado. – mheinzerling

2

Puede agregar atributos y métodos dinámicamente siempre que se realice a través del constructor de la misma manera que puede pasar una función como argumento de otra función.

class Example { 
    function __construct($f) 
    { 
     $this->action=$f; 
    } 
} 

function fun() { 
    echo "hello\n"; 
} 

$ex1 = new class('fun'); 

No se puede llamar directlry $ex1->action(), se debe asignar a una variable y luego puede llamar a esta variable como una función.

+0

Por favor, publique una parte esencial aquí – VladL

0

Puede crear un atributo en su clase: methods=[]
y utilizar para crear create_function función lambda.
Agréguela en el atributo methods, en el índice del nombre del método que desee.
uso:

function __call($method, $arguments) 
{ 
    if(method_exists($this, $method)) 
     $this->$method($arguments); 
    else 
     $this->methods[$method]($arguments); 
} 

a encontrar y llamar buen método.

1

¿Es esto lo que necesita?

$methodOne = function() 
{ 
    echo "I am doing one.".PHP_EOL; 
}; 

$methodTwo = function() 
{ 
    echo "I am doing two.".PHP_EOL; 
}; 

class Composite 
{ 
    function addMethod($name, $method) 
    { 
     $this->{$name} = $method; 
    } 

    public function __call($name, $arguments) 
    { 
     return call_user_func($this->{$name}, $arguments); 
    } 
} 


$one = new Composite(); 
$one -> addMethod("method1", $methodOne); 
$one -> method1(); 
$one -> addMethod("method2", $methodTwo); 
$one -> method2(); 
Cuestiones relacionadas