Ver Mensaje Individual
  #1 (permalink)  
Antiguo 22/02/2015, 09:23
Avatar de guardarmicorreo
guardarmicorreo
 
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
¿Pasar un identificador de una funcion a variable e incluirla en una sentencia?

Tengo la siguiente gran duda que me ha surgido y no logro resolver.

Si en un directorio B tengo un documento b.php con el siguiente código

Código PHP:
Ver original
  1. <?php
  2. namespace B;
  3.  
  4. function b(){
  5.     ?>
  6.     <p>hola mundo</p>
  7.     <?php
  8. }

En otro directorio A tengo un documento a.php con el siguiente código

Código PHP:
Ver original
  1. <?php
  2. namespace A
  3.  
  4. class A{
  5.     public function invoke($func){
  6.         //esto devuelve error de sintaxis
  7.         return \B\$func();
  8.     }
  9. }
  10. ?>

Entonces, cómo lo anterior da error de sintaxis, probé con esto otro

Código PHP:
Ver original
  1. <?php
  2. namespace A
  3. class A{
  4.     public function invoke($func){
  5.         //esto devuelve un string, era evidente, pero por probar...
  6.         return "\B\${func}()";
  7.     }
  8. }
  9. ?>

Entonces decidí incluir el archivo

Código PHP:
Ver original
  1. namespace A
  2.  
  3. //incluye un documento
  4. function load($func){
  5.     include "./html/${func}.php";
  6. }
  7.  
  8. class A{
  9.     public function invoke($func){
  10.         load($func);
  11.         return ${func}();
  12.     }
  13. }

En este punto, no reconoce la función b(), sí incluye el archivo, porque no devuelve error, notice, etc. pero dice que esa función no ha sido econtrada; entonces deduje que era porque el namespace en dónde está definida la función es distinto: se produce un cambio de namespace.

Así que quité el namespace en donde está escrita la funcion b() y efectivamente sí funcionó el código.

Siempre teniendo en cuenta que llamo a la clase A desde un documento en un directorio de jerarquía superior con spl_autoload_register();

Y claro, la duda es

¿no hay una manera de poder llamar a la función (en un ambiente dónde la llamada debe ser ciega/dinámica para poder utilizar cualquier función dentro del directorio B) utilizando algo cómo lo siguiente pero que no de error?

Código PHP:
Ver original
  1. namespace A
  2. class A{
  3.     public function invoke($func){
  4.         //de esta manera
  5.         //(da error porque espera un identificador, no una variable)
  6.         return \B\${func}();
  7.        //o de esta otra manera
  8.         return \B\$func();
  9.     }
  10. }

El propósito es no tener que usar una función al margen de una clase para tener que incluir el archivo y que el código quede más legible utilizando el namespace de la función. ¿Se llama performance ?

Saludos.
__________________
Ayúdame a hacerlo por mi mismo.

Última edición por guardarmicorreo; 22/02/2015 a las 09:29