Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] PHP OO Sintaxis entre identificador de namespace y variable

Estas en el tema de Sintaxis entre identificador de namespace y variable en el foro de PHP en Foros del Web. El problema que tengo es que quiero llamar a una clase de forma dinámica dentro de un namespace que coincide con la carpeta donde están ...
  #1 (permalink)  
Antiguo 21/02/2015, 09:21
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Sintaxis entre identificador de namespace y variable

El problema que tengo es que quiero llamar a una clase de forma dinámica dentro de un namespace que coincide con la carpeta donde están los archivos (cada archivo contiene una clase distinta), pero al hacerlo así:

Código PHP:
Ver original
  1. new \module\$this->module();

Me devuelve error de sintaxis, ya que después de la última barra invertida/contrabarra debe ir un identificador para cumpli con los nombres cualificados o semicualificados de los espacios de nombres.

¿Alguna idea para solucionar este problema y poder usar un espacio de nombres en una llamada dinámica a clases?

Saludos.
__________________
Ayúdame a hacerlo por mi mismo.
  #2 (permalink)  
Antiguo 21/02/2015, 11:46
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Sintaxis entre identificador de namespace y variable

¿La clase está instanciada dentro del namespace?

¿Podrías mostrar dicho código?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 21/02/2015, 13:28
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: Sintaxis entre identificador de namespace y variable

Hola pateketrueke, cuanto tiempo! :D

La clase no está instanciada dentro del namespace, evidentemente sí está declarada/escrita, esta es la clase original, pero no va a servir porque he seguido trabajando para solucionarlo y ahora el problema que tengo es otro.

Código PHP:
Ver original
  1. namespace controller;
  2. class Front{
  3.     private $class;
  4.     private $module;
  5.     private $method;
  6.     private $args;
  7.     public function __construct($module='Home', $method, $args) {
  8.         $this->module = $module;
  9.         $this->method = $method;
  10.         $this->args   = $args;
  11.     }
  12.    
  13.     public function __toString(){
  14.             //no incluí metodo ni argumentos porque es sólo de prueba a ver si la llamada funciona
  15.             new \module\$this->module();
  16.     }
  17. }

El estado actual de la clase es este

Código PHP:
Ver original
  1. namespace controller;
  2. class Front{
  3.    
  4.     public function invoke($args) {
  5.        
  6.         $class = '\module\\'.$args['module']()->$args['method']($args['args']);
  7.        
  8.         return new $class;
  9.     }
  10. }

Ahora el problema es que no reconoce el metodo cómo el nombre de una clase, sino cómo una función en el namespace, la cual no está. Me muestra este error

Cita:
Fatal error: Call to undefined function Home() in /srv/www/htdocs/blog/controller/front.php on line 27
La línea 27 es la línea del return.

Para complementar los archivos, el estado actual del return del index es este

Código PHP:
Ver original
  1. echo (new \controller\Front())->invoke($args);

Y el archivo del modulo Home

Código PHP:
Ver original
  1. namespace module;
  2.  
  3. class Home{
  4.     public function home() {
  5.         return "hola";
  6.     }
  7. }

Si quieres todos los archivos tan sólo dilo y lo subo en un segundo y te pongo el enlace.

Una vez resuelto esto iré a resolver lo del otro post: por qué me dice que obtengo un object en vez de un string, pero creo que es por eso que me dijiste, que estoy instanciando directamente el constructor, error terrible que no tuve en cuenta jeje.

Muchas gracias por tu ayuda.
__________________
Ayúdame a hacerlo por mi mismo.
  #4 (permalink)  
Antiguo 21/02/2015, 14:48
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Sintaxis entre identificador de namespace y variable

Esto es completamente ambiguo y sin orden:
Código PHP:
Ver original
  1. // MAL
  2. $class = '\module\\'.$args['module']()->$args['method']($args['args']);
  3. return new $class;
  4.  
  5. // BIEN
  6. $class = '\module\\'.$args['module']; // nombre completo de la clase
  7. $obj = new $class; // nueva instancia
  8.  
  9. return $obj->{$args['method']}($args['args']); // invoca el método

Primero debes crear bien el nombre de la clase a instanciar, luego instancías la clase, finalmente ejecutas el método.

Tu estás tratando de hacerlo todo en una sóla linea, esperando que con hacer "new" se invocará todo de forma mágica ¿o cómo?

Parece que te estás saltando muchas de las normas de sintaxis, básica inclusive, del lenguaje y sobre todo reglas de manejo de OOP: deberías leer un manual.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 21/02/2015, 15:33
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: Sintaxis entre identificador de namespace y variable

Cita:
Iniciado por pateketrueke Ver Mensaje
Esto es completamente ambiguo y sin orden:
Código PHP:
Ver original
  1. // MAL
  2. $class = '\module\\'.$args['module']()->$args['method']($args['args']);
  3. return new $class;
  4.  
  5. // BIEN
  6. $class = '\module\\'.$args['module']; // nombre completo de la clase
  7. $obj = new $class; // nueva instancia
  8.  
  9. return $obj->{$args['method']}($args['args']); // invoca el método

Primero debes crear bien el nombre de la clase a instanciar, luego instancías la clase, finalmente ejecutas el método.

Tu estás tratando de hacerlo todo en una sóla linea, esperando que con hacer "new" se invocará todo de forma mágica ¿o cómo?

Parece que te estás saltando muchas de las normas de sintaxis, básica inclusive, del lenguaje y sobre todo reglas de manejo de OOP: deberías leer un manual.
Sí, funcionó. ¿dónde podría leer sobre esta sintaxis? porque en el manual de PHP explican la sintaxis básica, pero nada más.
__________________
Ayúdame a hacerlo por mi mismo.
  #6 (permalink)  
Antiguo 21/02/2015, 19:19
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 4 meses
Puntos: 379
Respuesta: Sintaxis entre identificador de namespace y variable

La forma en que se este accediendo al método en el ejemplo de pateketrueke lo puedes entender mejor si ves el tema de sintaxis compleja: http://php.net/manual/en/language.types.string.php
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.

Etiquetas: identificador, namespace, sintaxis, variable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:47.