Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Clases Estaticas

Estas en el tema de Clases Estaticas en el foro de Frameworks y PHP orientado a objetos en Foros del Web. HOlandas! Se puede en PHP usar una clase sin tener que instanciarla? En lenguajes orientados al objeto como C#, se pueden definir una "STATIC CLASS" ...
  #1 (permalink)  
Antiguo 30/03/2010, 10:26
Avatar de Muzztein  
Fecha de Ingreso: agosto-2002
Ubicación: Hangar 18
Mensajes: 1.703
Antigüedad: 21 años, 8 meses
Puntos: 16
Clases Estaticas

HOlandas!

Se puede en PHP usar una clase sin tener que instanciarla?

En lenguajes orientados al objeto como C#, se pueden definir una "STATIC CLASS"
y poder utilizarla sin tener que instanciarla usando el comando NEW.

NO se si es que es posible hacer eso en PHP ni tampoco si compartiran el mismo nombre de "clase estatica", de ahi que no he visto mucha documentacion.

cualquier ayuda se agradece.
  #2 (permalink)  
Antiguo 30/03/2010, 10:57
Avatar de eulloa  
Fecha de Ingreso: octubre-2007
Ubicación: Donde caiga la noche, si mi hijo me deja
Mensajes: 691
Antigüedad: 16 años, 6 meses
Puntos: 5
Respuesta: Clases Estaticas

Si se puede
http://www.php.net/manual/en/language.oop5.static.php
  #3 (permalink)  
Antiguo 30/03/2010, 13:53
Avatar de bng5  
Fecha de Ingreso: junio-2009
Ubicación: 127.0.0.1
Mensajes: 269
Antigüedad: 14 años, 10 meses
Puntos: 24
Respuesta: Clases Estaticas

No se declaran como estáticas a las clases, si a sus atributos y métodos.
Normalmente se puede llamar a un método de forma estática aunque no se haya declarado como tal.

Código PHP:
<?php

class Clase {
  const 
CONSTANTE 'Constante';
  var 
$var1 1;  // $var1 no puede ser llamado de forma estática
  
static $var2 2;
  
  function 
metodo1() {
    return 
"Método 1";
  }

  static function 
metodo2() {
    return 
"Método 2";
  }
}


echo 
Clase::CONSTANTE// imprime Constante
echo "\n";
echo 
Clase::$var2// imprime 2
Clase::$var2 3;
echo 
"\n";
echo 
Clase::$var2// imprime 3
echo "\n";
echo 
Clase::metodo1(); // imprime Método 1
echo "\n";
echo 
Clase::metodo2(); // imprime Método 2
echo "\n"


?>

Última edición por bng5; 30/03/2010 a las 13:57 Razón: Faltó resaltado de código
  #4 (permalink)  
Antiguo 30/03/2010, 14:13
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Clases Estaticas

En PHP 5.1+ ya genera un error si accesas a una clase de forma estatica siendo que esta no es estatica, y si esta clase ocupa $this, generar un error fatal.
  #5 (permalink)  
Antiguo 30/03/2010, 14:57
Avatar de bng5  
Fecha de Ingreso: junio-2009
Ubicación: 127.0.0.1
Mensajes: 269
Antigüedad: 14 años, 10 meses
Puntos: 24
Respuesta: Clases Estaticas

Cita:
Iniciado por GatorV Ver Mensaje
En PHP 5.1+ ya genera un error si accesas a una clase de forma estatica siendo que esta no es estatica
No entiendo a que te referís. Si yo declaro una clase como estática de la siguiente forma me devuelve los siguientes errores.

Código PHP:
<?php

static class Clase {

}

?>
PHP 5.2.4-2ubuntu5.10 with Suhosin-Patch 0.9.6.2 (cli) y PHP 5.2.11 (cli)
Parse error: syntax error, unexpected T_CLASS, expecting T_VARIABLE in /home/bng5/Escritorio/static on line 3

PHP 5.3.1 (cli)
Parse error: syntax error, unexpected T_CLASS, expecting T_PAAMAYIM_NEKUDOTAYIM in /home/bng5/Escritorio/static on line 3
  #6 (permalink)  
Antiguo 30/03/2010, 15:03
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Clases Estaticas

Me refiero a un método:
Código PHP:
Ver original
  1. class StaticTest
  2. {
  3.         public function foo() {}
  4.  
  5.         public static function staticfoo() {
  6.                $this->foo();
  7.         }
  8. }
  9.  
  10. StaticTest:foo(); // E_STRICT error
  11. StaticTest:staticfoo(); // FATAL_ERROR using $this when not in context

Saludos.
  #7 (permalink)  
Antiguo 30/03/2010, 15:31
Avatar de bng5  
Fecha de Ingreso: junio-2009
Ubicación: 127.0.0.1
Mensajes: 269
Antigüedad: 14 años, 10 meses
Puntos: 24
Respuesta: Clases Estaticas

Ah, OK. Ahora entiendo a que te referís. Es un error de estándares estrictos, yo lo tenía en E_ALL ^ E_NOTICE, por lo que omitia este error.
Si el reporte de errores lo tenés en E_STRICT (error_reporting(E_STRICT);) te da el siguiente error:

Strict Standards: Non-static method Clase::metodo1() should not be called statically in /home/bng5/Escritorio/static on line xx

EDIT:
Sigo usando el mismo ejemplo que usé más arriba (#post3345014).
  #8 (permalink)  
Antiguo 31/03/2010, 05:34
Avatar de Muzztein  
Fecha de Ingreso: agosto-2002
Ubicación: Hangar 18
Mensajes: 1.703
Antigüedad: 21 años, 8 meses
Puntos: 16
Respuesta: Clases Estaticas

gracias chicos, entonces resumiendo, la clase no se coloca como estatica, sino que sus metodos.
  #9 (permalink)  
Antiguo 31/03/2010, 06:29
Avatar de eulloa  
Fecha de Ingreso: octubre-2007
Ubicación: Donde caiga la noche, si mi hijo me deja
Mensajes: 691
Antigüedad: 16 años, 6 meses
Puntos: 5
Respuesta: Clases Estaticas

Resumiendo, sip. ¿Checaste el manual, el link q te dejé más arriba?
  #10 (permalink)  
Antiguo 31/03/2010, 08:21
 
Fecha de Ingreso: enero-2005
Mensajes: 122
Antigüedad: 19 años, 3 meses
Puntos: 2
Respuesta: Clases Estaticas

Buenas, no entiendo bien este concepto de las declaraciones estaticas,

Si tengo esto:

Código PHP:
    class Prueba {
        
        protected static 
$var 1;
        
        protected static function 
metodo() {
            return 
self::$var;
        }
        
        public static function 
getConstant(){
            return 
self::metodo();
        }
        
        public function 
saludo(){
            return 
'Hola mundo';
        }
        
    } 
cuando accedo a el metodo getConstant de esta manera:
Código PHP:
echo Prueba::getConstant(); //esto me imprime '1' 
y si hago:

Código PHP:
$saludos = new Prueba();
echo 
$saludos->getConstant(); // Me imprime tambien '1' 
Ademas de esto, cuando hago:

Código PHP:
echo Prueba::saludo(); // Imprime 'Hola mundo' sin ser metodo estatico 
Entonces no entiendo para que utilizar metodos y atributos estaticos si cuando creo la instancia de la clase de igual manera puedo acceder a ellos, aun cuando la documentacion dice que no se puede, me podrian aclarar esto, o en que estoy equivocado???

Gracias.
  #11 (permalink)  
Antiguo 31/03/2010, 09:02
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Clases Estaticas

Funciona ya que como dije más arriba no tienes E_STRICT activado, si lo tienes activado te lanza un error, también en PHP6 ya te producira un error E_FATAL por lo que es importante que programes de forma adecuada.

Saludos.
  #12 (permalink)  
Antiguo 31/03/2010, 09:08
 
Fecha de Ingreso: enero-2005
Mensajes: 122
Antigüedad: 19 años, 3 meses
Puntos: 2
Respuesta: Clases Estaticas

Ah ok, muchas gracias Gator, pero entonces lo tengo que activar en el PHP.ini o en donde??

Gracias.
  #13 (permalink)  
Antiguo 31/03/2010, 10:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Clases Estaticas

Así es, en la directiva error_reporting.

Saludos.
  #14 (permalink)  
Antiguo 31/03/2010, 10:57
 
Fecha de Ingreso: enero-2005
Mensajes: 122
Antigüedad: 19 años, 3 meses
Puntos: 2
Respuesta: Clases Estaticas

Muchas gracias, ya active E_STRIC ahora, cuando hago Prueba::saludos() me sale un warning diciendome que no puedo llamar ese metodo como si fuera estatico hasta ahi bien, pero cuando hago $saludos->getConstant(); me sigue saliendo el resultado y no me saca nada de errores y deberia de salirme que no debo llamar ese metodo a travez de la instancia porque esta estatico.. que deberia de hacer adicional?

Gracias.
  #15 (permalink)  
Antiguo 31/03/2010, 11:10
Avatar de eulloa  
Fecha de Ingreso: octubre-2007
Ubicación: Donde caiga la noche, si mi hijo me deja
Mensajes: 691
Antigüedad: 16 años, 6 meses
Puntos: 5
Respuesta: Clases Estaticas

Consultando el manual:
A property declared as static can not be accessed with an instantiated class object (though a static method can).
Because static methods are callable without an instance of the object created, the pseudo-variable $this is not available inside the method declared as static.
Static properties cannot be accessed through the object using the arrow operator ->
  #16 (permalink)  
Antiguo 31/03/2010, 11:17
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Clases Estaticas

Eso quiere decir que desde dentro de una instancía sí puedes accesar a un valor estatico, de hecho es muy usado para tener propiedades estaticas que son comunes a varias clases, por ejemplo como lo hacen en Zend Framework con la propiedad setDefaultAdapter para Zend_Db_Table.

Saludos.
  #17 (permalink)  
Antiguo 31/03/2010, 12:39
 
Fecha de Ingreso: enero-2005
Mensajes: 122
Antigüedad: 19 años, 3 meses
Puntos: 2
Respuesta: Clases Estaticas

Ok gator, te entiendo, pero yo estoy accediendo a un atributo estatico desde una instancia que hace referencia a un metodo estatico tambien para obtener el valor del atributo estatico y no deberia, ya que si lo hago de esta manera, entonces no tendria sentido declarar los metodos como estaticos si me van a fucionar igual que los publicos, que dicen compañeros???
  #18 (permalink)  
Antiguo 31/03/2010, 12:48
Avatar de bng5  
Fecha de Ingreso: junio-2009
Ubicación: 127.0.0.1
Mensajes: 269
Antigüedad: 14 años, 10 meses
Puntos: 24
Respuesta: Clases Estaticas

No se olviden del 'método mágico' __call y en PHP 5.3 se agregó __callStatic para sobrecarga.

http://www.php.net/manual/en/languag...oading.methods
  #19 (permalink)  
Antiguo 31/03/2010, 13:02
Avatar de eulloa  
Fecha de Ingreso: octubre-2007
Ubicación: Donde caiga la noche, si mi hijo me deja
Mensajes: 691
Antigüedad: 16 años, 6 meses
Puntos: 5
Cita:
Iniciado por Brahyam Ver Mensaje
Ok gator, te entiendo, pero yo estoy accediendo a un atributo estatico desde una instancia que hace referencia a un metodo estatico tambien para obtener el valor del atributo estatico y no deberia, ya que si lo hago de esta manera, entonces no tendria sentido declarar los metodos como estaticos si me van a fucionar igual que los publicos, que dicen compañeros???
Es q hasta donde se, que sean públicos o privados no tiene q ver con q sean estáticos o no. Si no quieres q se vean desde afuera, pues utiliza protected o private. Eso es visibilidad
UPSSSS: Ver más abajo jejejeje

Es q hasta donde se, que sean públicos o privados no tiene q ver con q sean estáticos o no. Si no quieres q se vean desde afuera, pues utiliza protected o private. Eso es visibilidad....
En lo referente a static este comportamiento está explicado más arriba en lo q posteé, sacado del mismo manual

Última edición por GatorV; 31/03/2010 a las 14:18
  #20 (permalink)  
Antiguo 31/03/2010, 13:18
 
Fecha de Ingreso: enero-2005
Mensajes: 122
Antigüedad: 19 años, 3 meses
Puntos: 2
Respuesta: Clases Estaticas

Ok eulloa entiendo lo que me dices, pero en el manual dice que los metodos estaticos no pueden ser llamados desde una instancia y yo lo estoy haciendo arrojandome un resultado y no me genera ninguna alerta aun cuando tengo activado E_STRICT, a eso es a lo que me refiero...
  #21 (permalink)  
Antiguo 31/03/2010, 13:33
Avatar de eulloa  
Fecha de Ingreso: octubre-2007
Ubicación: Donde caiga la noche, si mi hijo me deja
Mensajes: 691
Antigüedad: 16 años, 6 meses
Puntos: 5
Respuesta: Clases Estaticas

Cita:
Iniciado por Brahyam Ver Mensaje
pero en el manual dice que los metodos estaticos no pueden ser llamados desde una instancia.
Nop, al contrario

A property declared as static can not be accessed with an instantiated class object (though a static method can).
  #22 (permalink)  
Antiguo 31/03/2010, 13:57
Avatar de bng5  
Fecha de Ingreso: junio-2009
Ubicación: 127.0.0.1
Mensajes: 269
Antigüedad: 14 años, 10 meses
Puntos: 24
Respuesta: Clases Estaticas

Resumo un poco, porque parece que a eulloa le cobran por palabra a no ser que sea un 'copy & paste'.

Un método solamente debería ser llamado de forma estática cuando fue declarado como tal.
En cambio un método estático puede ser llamado de forma estática tanto como desde una instancia de la clase.

Código PHP:
<?php

//error_reporting(E_ALL ^ E_NOTICE);
error_reporting(E_STRICT E_NOTICE);

class 
Clase {

  function 
metodo_NO_estatico() {
    return 
"Método NO estático \n";
  }

  static function 
metodo_estatico() {
    return 
"Método estático \n";
  }
}


// echo Clase::metodo_NO_estatico(); // Esto produce un error de estándares estrictos
echo Clase::metodo_estatico();

$obj = new Clase;
echo 
$obj->metodo_NO_estatico();
echo 
$obj->metodo_estatico();

?>
Ten en cuenta que esto aplica para los métodos, los atributos es otra historia.
  #23 (permalink)  
Antiguo 31/03/2010, 14:03
Avatar de eulloa  
Fecha de Ingreso: octubre-2007
Ubicación: Donde caiga la noche, si mi hijo me deja
Mensajes: 691
Antigüedad: 16 años, 6 meses
Puntos: 5
Respuesta: Clases Estaticas

Cita:
Iniciado por bng5 Ver Mensaje
Resumo un poco, porque parece que a eulloa le cobran por palabra a no ser que sea un 'copy & paste'.
Aceptada la crítica
¿Pero es que el mismo manual no se explica por sí solo?
  #24 (permalink)  
Antiguo 31/03/2010, 14:19
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Clases Estaticas

Aunque un método estatico accesado desde una instancia de un objeto se puede hacer no es lo más recomendable ya que podría cambiar en un futuro, yo te recomendaría accesar a esos métodos de forma estatica, o usando self:: dentro de la misma clase.

Saludos.
  #25 (permalink)  
Antiguo 31/03/2010, 14:20
 
Fecha de Ingreso: enero-2005
Mensajes: 122
Antigüedad: 19 años, 3 meses
Puntos: 2
Respuesta: Clases Estaticas

Ok listo, ya creo entender este asunto... Gracias a todos.

Etiquetas: clases
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 20:02.