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

metodo static

Estas en el tema de metodo static en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola tengo una pregunta ¿para que sirve un metodo static y cuando hay que aplicarlo? <?php class Foo { public static function aStaticMethod() { // ...
  #1 (permalink)  
Antiguo 07/09/2006, 02:11
Avatar de don_fransisco  
Fecha de Ingreso: junio-2004
Mensajes: 193
Antigüedad: 19 años, 10 meses
Puntos: 1
metodo static

Hola tengo una pregunta
¿para que sirve un metodo static y cuando hay que aplicarlo?

<?php
class Foo {
public static function aStaticMethod() {
// ...
}
}

Foo::aStaticMethod();
?>

gracias
  #2 (permalink)  
Antiguo 07/09/2006, 11:08
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Un metodo static es muy util por decir cuando quieres hacer metodos que afecten a todas las instancias de la clase, es decir:

Suponiendo que tenemos una clase base:
Código PHP:
class talker {
     private static 
$prefix '';
     public function 
__construct() {}

     public static function 
setPrefix$prefix ) {
          
self::$prefix $prefix;
     }

     public function 
talk$text ) {
          if( !empty( 
self::$prefix ) ) echo self::$prefix;
          echo 
get_class() . "=>" $text;
     }

Ahora creamos unas clases para "hablar"
Código PHP:
class fulano extends talker {}
class 
sutano extends talker {}

$fulano = new fulano();
$sutano = new sutano();
$fulano->talk"hola" );
$sutano->talk"como estas?" ); 
Hasta ahora todo bien sin problemas, pero supongamos que queremos afectar todas las instancias actuales, solo con una linea de codigo, entonces le decimos al metodo estatico:
Código PHP:
talker::setPrefix"-----------\t" );
$sutano->talk"lalala" );
$fulano->talk"haha" ); 
Hasta ahora diras pero pues podrias hacer un metodo interno, pero supongamos que tu clase talker es usada dentro de otras clases, y esta heredada por otras clases, buscar la forma de "afectar" esa clase es bastante dificil, por eso recurrimos a metodos estaticos que sabemos que le va a afectar.

Un ejemplo es por decir, tienes una clase, usuario, hereda a una clase ActiveRecord, esta a su vez, usa una clase DB, si quieres afectar la forma, en que DB regrese los resultados, tendrias que hacer un metodo en ActiveRecord, que a su vez afectara a la clase DB, o, en la clase DB tener un metodo estatico que afecte todas las instancias de DB.

Espero con esto te des una idea para que sirven, y ojo!, en los metodos estaticos, no hay $this, ya que son llamados aparte de una instancia.
  #3 (permalink)  
Antiguo 07/09/2006, 12:59
Avatar de don_fransisco  
Fecha de Ingreso: junio-2004
Mensajes: 193
Antigüedad: 19 años, 10 meses
Puntos: 1
gracias amigo me quedo super claro, te agradesco un monton

saludos
  #4 (permalink)  
Antiguo 08/09/2006, 09:34
 
Fecha de Ingreso: octubre-2005
Mensajes: 85
Antigüedad: 18 años, 6 meses
Puntos: 0
Uhm la verdad a mi no me quedo muy claro.......

Un ejemplo es por decir, tienes una clase, usuario, hereda a una clase ActiveRecord, esta a su vez, usa una clase DB, si quieres afectar la forma, en que DB regrese los resultados, tendrias que hacer un metodo en ActiveRecord, que a su vez afectara a la clase DB, o, en la clase DB tener un metodo estatico que afecte todas las instancias de DB.

Haver la figura seria asi:

Usuario <= ActiveRecord <= DB

Lo que dices es que si cambio la forma en que DB regresa lo resultados a ACTIVERECORD, tengo que hacer un metodo en esta clase(ACTIVERECORD) y aqui viene el problemilla que a su vez afectara a la clase DB, uhm ni idea como implementar un metodo en activerecord y que afecte a su clase padre, teniendo en cuenta que lo que se desea es cambiar la forma en que DB regrese los datos, no se si me puedes citar un ejemplo sobre como seria ese metodo que se tenga que implementar en ACTIVERECORD y que a su vez afecte a DB, te lo agradeceria muchisimo, es que la verdad que esto de la POO es muy pero muy fascinante y siempre hay algo que aprender jejeje... de ante mano gracias GatorV, tus aportaciones me han servido de mucho
  #5 (permalink)  
Antiguo 08/09/2006, 12:23
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Bueno ese fue un ejemplo que me vino a la mente, yo por decir me encontre hace poco con un problema, tengo una clase que se encarga de hacer "modulos", o sea maneja las altas, bajas, modificaciones, y busquedas de una tabla, todo por una misma clase.

Esta clase implementa muchisimas otras clases, entre ellas una que es DataTable que se encarga de hacer una tabla de datos a partir de un Query SQL, esta tabla a su vez incorpora una clase Formatter que se encarga de "dibujar" cada celda y cada header de forma dinamica, (por decir si tengo idUsuario => Clave de Usuario).

El problema era como podia yo desde mi clase heredada de mi clase modulo decirle a la clase DataTable que usara otro formateador, y mi solucion fue usar metodos estaticos, asi ya podia hablar directamente con DataTable sin tener que estar asiendo "trucos".

Te pongo parte del codigo para que veas:
Código PHP:
import"com.uscconsultores.*" );

/**
 * Class porEncuestaModule
 *
 * Esta clase se encarga de proveer los metodos de actualizacion, edicion
 * borrado, etc. de cada tabla de la base de datos.
 * 
 * @package com.uscconsultores
 * @author Christopher Valderrama <[email protected]>
 * @copyright Copyright (c) 2006
 * @version $Id$v1.0$26 Jul 2006
 * @access public
 **/
class porEncuestaModule extends GeckoModuleManager {
    private 
$encuestaID// @var int private Guarda el ID de Encuesta actual
    
private $tabla// @var string private Guarda la Tabla actual
    
private $nowFields = array(); // @var array private guarda los campos a los cuales hay que darles por defecto el valor de "hoy"
    
    /**
     * Constructor
     *
     * Crea una instancia de nuestra clase, y establece algunos parametros nescesarios
     *
     * @param string $name Nombre del modulo
     * @param array $settings Settings para el modulo
     * @param int $encuestaID ID de la encuesta actual
     * @param string $tabla Nombre de la Tabla
     * @param array $nowFields Campos en los que se llena "hoy"
     **/
    
public function __construct$name$settings$encuestaID$tabla$nowFields ) {
        
$this->encuestaID $encuestaID;
        
$this->tabla $tabla;
        
$this->nowFields $nowFields;
        
        
/**
         * Establecemos que las tablas van a usar un formateador USC
         **/
        
GeckoDataTable::setDefaultFormatter( new USCFormatter() );
        
        
parent::__construct$name$settings );
    }
    
    
/**
     * newRecord
     *
     * Este metodo es llamado una vez que se ha procesado y validado la forma Web
     * agrega el campo nescesario de idEncuesta, y agrega la fecha de hoy para los
     * campos que la requieran.
     * 
     * @param array $form_fields
     * @access protected
     * @return mixed $id El id Auto Generado en la BD (si aplica)
     * @throws Exception cuando hay un error de insercion en la BD
     **/
    
protected function newRecord$form_fields ) {
        
$form_fields['idEncuesta'] = $this->encuestaID;
        if( 
is_array$this->nowFields ) && ( count$this->nowFields ) > ) ) {
            foreach( 
$this->nowFields as $field ) {
                
$form_fields[$field] = date"Y-m-d" );
            }
        }
        
        return 
parent::newRecord$form_fields );
    }
    
    
/**
     * buildBrowse
     *
     * Este metodo construye el query para generar el Table, y obtener los
     * campos de la base de datos.
     * 
     * @access protected
     * @return string El query generado limitado a datos por encuesta
     **/
    
protected function buildBrowse() {
        
$fields $this->buildQueryFields(); // Este metodo interno, selecciona los campos definidos en el XML
        
$query "SELECT %s FROM %s WHERE `idEncuesta`='%s'";
        
        
$query sprintf$query$fields$this->tabla$this->encuestaID );
        
        return 
$query;
    }

  #6 (permalink)  
Antiguo 09/09/2006, 10:07
 
Fecha de Ingreso: octubre-2005
Mensajes: 85
Antigüedad: 18 años, 6 meses
Puntos: 0
Bueno tu ahi tienes un metodo estatico llamado setDefaultFormatter al cual le indicas que formateador usar cierto, bueno ahora me quedo un poco mas claro su uso. Muchas gracias GatorV, se ve que esto es ya un poco mas complejo porque ahi tienes otras cosillas :

GeckoModuleManager
import( "com.uscconsultores.*" );
return parent::newRecord( $form_fields ); ==> este metodo newrecord, que haces le das los parametros para agregar?


Bueno otra vez gracias bye

Última edición por soonye; 09/09/2006 a las 10:16
  #7 (permalink)  
Antiguo 09/09/2006, 22:27
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Asi es, todo esto es parte de un framework y uso esta clase para extender una clase base que se encarga de hacer las altas, bajas, cambios, etc.
  #8 (permalink)  
Antiguo 12/09/2006, 09:43
Avatar de B**
B**
 
Fecha de Ingreso: enero-2006
Ubicación: Monterrey,Mexico
Mensajes: 952
Antigüedad: 18 años, 3 meses
Puntos: 3
Hablando del primer codigo que puso gatorV
Si solo usas public function metodo.... lo toma como un metodo estatico... por default no es asi?
Otra duda... que pasa si a ese mismo codigo ....al metodo setprefix no le pones que sea estatico... que error marca o que?.. no podrias alterar a las demas instancias?
Es que aun no lo termino de entender.. un metodo estatico sirve para modificar cualquier instancia? le puedes especificar cual ? o afecta a todas las instancias de la clase?
Muchas Gracias de antemano
__________________
-URL= Go PHP5.
-Age=22.
-Learning=PHP,J2EE,Struts,MAMBO,C++,JSON,AJAX,XHTML ,CSS.
  #9 (permalink)  
Antiguo 12/09/2006, 14:26
 
Fecha de Ingreso: octubre-2005
Mensajes: 85
Antigüedad: 18 años, 6 meses
Puntos: 0
Bueno ojala te sirva...............

Cita:
Iniciado por B** Ver Mensaje
Hablando del primer codigo que puso gatorV
Si solo usas public function metodo.... lo toma como un metodo estatico... por default no es asi?
No, si no colocas la palabra reservada static tu funcion sera normal, mas no estatica.

Cita:
Iniciado por B** Ver Mensaje
Otra duda... que pasa si a ese mismo codigo ....al metodo setprefix no le pones que sea estatico... que error marca o que?.. no podrias alterar a las demas instancias?
Bueno sino le colocas la palabra static tendrias que implementarla asi:


Código PHP:
class talker {
     private 
$prefix '';//aqui hubo cambio
     
public function __construct() {}

     public function 
setPrefix$prefix ) {//aqui hubo cambio
          
$this->prefix $prefix;//aqui hubo cambio
     
}

     public function 
talk$text ) {
          if( !empty( 
$this->prefix ) ) echo $this->prefix;//aqui hubo cambio
          
echo get_class() . "=>" $text;
     }

Y lo malo viene aqui:

Código PHP:
class fulano extends talker {}
class 
sutano extends talker {}

$fulano = new fulano();
$sutano = new sutano();
$fulano->setPrefix"-----------\t" );//se agrego
$sutano->setPrefix"-----------\t" );//se agrego
$fulano->talk"hola" );
$sutano->talk"como estas?" );

//PARA OBTENER LO MISMO 
Bueno es decir por cada instancia tendriamos que llamar al metodo setPrefix para que haga la impresion.

Cita:
Iniciado por B** Ver Mensaje
Es que aun no lo termino de entender.. un metodo estatico sirve para modificar cualquier instancia? le puedes especificar cual ? o afecta a todas las instancias de la clase?
Muchas Gracias de antemano
Bueno lo que te puedo decir es que un dato estatico es una variable miembro que no esta asociado a un objeto(instancia) de una clase, sino que se asocia a la clase misma, no hay una copia del dato para cada instancia(objeto), sino un sola copia que es compartida por todos las instancias(objetos) de la clase
otro ejemplo:
Código PHP:
class Cliente{
    public static 
$cont1 0;
    public 
$cont2 0;
    
    public function 
__construct(){
        
self::$cont1++;
        
$this->cont2++;
    }
    
    public function 
devuelve(){
        
$a = array(self::$cont1,$this->cont2);
        return 
$a;    
    }    
}

$cliente1 = new Cliente();
$cliente2 = new Cliente();
$cliente3 = new Cliente();
$contadores $cliente3->devuelve();

echo 
"<b>Valor del contador estatico</b>:    {$contadores[0]}<br>";
echo 
"<b>valor del contador normal</b>:       {$contadores[1]}"
Ah si estoy mal en algo, por favor diganmelo que les estare muy agradecido
  #10 (permalink)  
Antiguo 12/09/2006, 17:31
Avatar de B**
B**
 
Fecha de Ingreso: enero-2006
Ubicación: Monterrey,Mexico
Mensajes: 952
Antigüedad: 18 años, 3 meses
Puntos: 3
Ohh que bien soonye.. lo he entendido.. muchas gracias eh
__________________
-URL= Go PHP5.
-Age=22.
-Learning=PHP,J2EE,Struts,MAMBO,C++,JSON,AJAX,XHTML ,CSS.
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 1 personas (incluyéndote)




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