Foros del Web » Programando para Internet » PHP »

__invoke e instancias de objetos estáticos

Estas en el tema de __invoke e instancias de objetos estáticos en el foro de PHP en Foros del Web. Vamos a ver... tengo un problema con el nuevo metodo mágico de php __invoke. El problema biene cuadno tengo una instancia de un objeto almacenada ...
  #1 (permalink)  
Antiguo 07/06/2011, 05:53
 
Fecha de Ingreso: agosto-2010
Mensajes: 40
Antigüedad: 11 años, 2 meses
Puntos: 2
__invoke e instancias de objetos estáticos

Vamos a ver... tengo un problema con el nuevo metodo mágico de php __invoke.

El problema biene cuadno tengo una instancia de un objeto almacenada en una propiedad estática, por ejemplo
Código PHP:
class clase
{
      public function 
__invoke()
     {
               
$this->hola();
     }
     
    public function 
hola()
    {
                 echo 
"hola";
    }

}


class 
clase2
{
      public static 
$instancia;
      
      public function 
__construct()
      {
               
self::$instancia=new clase;
      }

      public function 
prueba()
      {
                
self::$instancia(); //ya que en clase tenemos definido el __invoke
     
}

sin embargo si que me funciona bien si hago una copia de la variable estatica $instancia en una variable local a la funcion prueba:
Código PHP:
      public function prueba()
      {
              
$i=self::$instancia;  
              
$i(); //funciona
     

o si llamo directamente a el metodo hola()

Código PHP:
 public function prueba()
      {
                
self::$instancia->hola(); //SIN __invoke
     


los errores que me dan son un "notice: Undefined variable $instancia" y " Function name must be a string "


¿porque pasa esto?
  #2 (permalink)  
Antiguo 07/06/2011, 06:13
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 12 años, 4 meses
Puntos: 1517
Respuesta: __invoke e instancias de objetos estáticos

Y este usuario que comentó en el manual de PHP lo indicó tambien Podría ser que no se contempló todavía el uso de ese método mágico en los estáticos. Al menos sabes como resolverlo Y hasta traté hacerlo con
Código PHP:
Ver original
  1. {self::$instancia}() // muestra Parse error...
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Última edición por abimaelrc; 07/06/2011 a las 06:40
  #3 (permalink)  
Antiguo 07/06/2011, 06:27
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 13 años, 9 meses
Puntos: 845
Respuesta: __invoke e instancias de objetos estáticos

Es que tiene cierta lógica, primero evalúa a $instancia y por eso el error, una solución ya la tienes, es asignar primero, otra opción seria utilizar call_user_func.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #4 (permalink)  
Antiguo 07/06/2011, 10:29
 
Fecha de Ingreso: agosto-2010
Mensajes: 40
Antigüedad: 11 años, 2 meses
Puntos: 2
Respuesta: __invoke e instancias de objetos estáticos

Pues a ver si lo solucionan, la verdad que es una pena.

si el objeto esta instanciado en una propiedad de un objeto tampoco funciona , es decir, solo funcina si esta guardado en una variable local a la funcion.


Muchas gracias ;)

pd:abimaelrc jeje me lees la mente, ya lo intente como tu tambien ;)
  #5 (permalink)  
Antiguo 07/06/2011, 10:39
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 13 años, 9 meses
Puntos: 845
Respuesta: __invoke e instancias de objetos estáticos

Si no quieres guardar en una variable local utiliza call_user_func, como te comente antes:

Código PHP:
Ver original
  1. public function prueba()
  2. {
  3.     call_user_func(self::$instancia);
  4. }
__________________
http://es.phptherightway.com/
thats us riders :)
  #6 (permalink)  
Antiguo 07/06/2011, 17:09
 
Fecha de Ingreso: agosto-2010
Mensajes: 40
Antigüedad: 11 años, 2 meses
Puntos: 2
Respuesta: __invoke e instancias de objetos estáticos

Bueno la idea era un poco mas compleja, tenia en $instancia una clase en la que implementaba un "¿builder?", es decir, que me devolvia un objeto a una clase dinamicamente dependiendo de lo que le pasara como parametro.

todo esto forma parte de un sistema un poco mas complejo, estaba dentro de un front-controller.... me venia bien tenerlo estático para poder acceder desde cuaquier lugar de la aplicacion de la forma $instancia(classTexto)->funcion()...

el call_user_func me biene bien pero por sencillez prefiero declarar una variable local, es mas problema de comodidad que de otra cosa

Gracias por todo, veo que controlais mucho mucho por aqui ;)
  #7 (permalink)  
Antiguo 07/06/2011, 17:25
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 13 años, 6 meses
Puntos: 2534
Respuesta: __invoke e instancias de objetos estáticos

Les alcanzo el siguiente enlace de un experimento que llevo con PHP 5.3+ y OOP.

https://github.com/pateketrueke/prototipo

Espero que les sea de utilidad, pues al parecer existe algo de relación.

__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #8 (permalink)  
Antiguo 07/06/2011, 17:40
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 13 años, 9 meses
Puntos: 845
Respuesta: __invoke e instancias de objetos estáticos

Cita:
Iniciado por ivan_teruel92 Ver Mensaje
Bueno la idea era un poco mas compleja, tenia en $instancia una clase en la que implementaba un "¿builder?", es decir, que me devolvia un objeto a una clase dinamicamente dependiendo de lo que le pasara como parametro.

todo esto forma parte de un sistema un poco mas complejo, estaba dentro de un front-controller.... me venia bien tenerlo estático para poder acceder desde cuaquier lugar de la aplicacion de la forma $instancia(classTexto)->funcion()...

el call_user_func me biene bien pero por sencillez prefiero declarar una variable local, es mas problema de comodidad que de otra cosa

Gracias por todo, veo que controlais mucho mucho por aqui ;)
Lo que estas comentando se suele solventar con Factory, simplemente retornando el objeto creado sin guardarlo estaticamente, pero talves esto no sirva para tu caso en concreto.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #9 (permalink)  
Antiguo 08/06/2011, 09:56
 
Fecha de Ingreso: agosto-2010
Mensajes: 40
Antigüedad: 11 años, 2 meses
Puntos: 2
Respuesta: __invoke e instancias de objetos estáticos

Exacto masterpuppet, a eso me referia, jeje no me acordaba del termino exacto ;):

Un ejemplo de factory:
Código PHP:
<?php

//archivo hlp.php

include("helpers/helper.texto.php");
include(
"helper/helper.errores.php");
class 
helpers
{
    public function 
__construct()
    {}
    
    public function 
__invoke($helpers)
       {
       return 
$this->devolver_instancia($helpers);
       
    }
    
    public function 
devolver_instancia($helper)
    {
        
        if(
class_exists($helper))
        {
            return new 
$helper();
        }
        else
             return 
false;
    }
}

?>
echare un vsitazo pateketrueke, gracias ;)

por cierto, sabeis si hay gente de España por el foro de entre 18 y 20 años mas o menos?? jajaja conozco a poca gente de mi edad :S

Última edición por ivan_teruel92; 08/06/2011 a las 10:06

Etiquetas: instancias, objetos
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

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 09:35.