Páginas

sábado, 18 de diciembre de 2010

Programacion Orientada a Objetos Metodos y Atributos estaticos


Para esta entrada continuando con el tema de la Programación Orientada a Objetos, voy  a hablarles sobre los atributos y métodos estáticos, como acceder a ellos que son, el operador de ámbito, y la funcionalidad de este tipo de metodos.

Cuando declaramos un método estático “static”,  le indicamos que este no puede acceder directamente  a los atributos y métodos de la clase donde fue creado, para declarar un método estático le colocamos la palabra “static delante de la visibilidad del método que se está creando.

<?php
class nombreClase
{
     static public function metodoClase()
    {
        #metodos de la clase
    }
}
?>

Sencillo no?? En el artículo anterior trabajábamos con la variable “$this” para acceder a los atributos y métodos de la clase desde los otros métodos de la misma. Con los métodos estáticos es diferente, ya que si intentamos acceder a un atributo o un método de la clase desde un método estático con la variable $this nos daría un error de contexto veamos un ejemplo:

<?php
class nombreClase
{
     static public function medotoEstatico ()
    {
            $this-> metodoClase ()
    }   
    public function metodoClase()
    {
          echo “Hola como estas”;         
    }
}
nombreClase::medotoEstatico();
?>
Nos daría el siguiente error: “Fatal error: Using $this when not in object context”, esto si traducimos el mensaje lo que nos indica es que no hay un contexto de objeto por usar el $this”, que es como accedemos a los atributos y/o métodos  de la misma clase normalmente, en su lugar cuando trabajamos métodos estáticos debemos usar “self”, la palabra “self” hace referencia a la clase que se está trabajando, a diferencia de $this que hace referencia a la instancia de la clase, entonces para que el ejemplo anterior funcionara la implementación seria de la siguiente manera

<?php
class nombreClase
{
     static public function medotoEstatico ()
    {
           self::metodoClase ();
    }   
    public function metodoClase()
    {
            echo “Hola como estas”;         
    }
}
nombreClase::medotoEstatico();
?>

Ahora si nos daría el resultado que deseamos. Pero que hicimos?? O en qué momento instanciamos la clase??  Una de las ventajas de los métodos estáticos es que no es necesario crear un objeto para acceder a ellos, esto en ocasiones puede ser útil ya que hay veces que solo necesitamos utilizar un método de una clase y no la instancia completa, la manera de acceder a estos es con el nombre de la clase seguido del operador de ámbito “::”.

Antes de ir al ejemplo definiremos el operador de ámbito (::), es aquel que nos permite acceder a los métodos y/o atributos estáticos de una clase, bien sea para referirnos al atributo o método desde afuera de esta, como para llamar a un atributo o método desde un método estático, tambien nos sirve para acceder a metodos de la clase padre mediante la palabra "parent::metodoDelPadre", ahora si vamos al ejemplo que nos muestra tanto el operador de ámbito como el llamado a un método estático.

Ejemplo:

<?php
nombreClase::medotoEstatico();
?>

Si nos fijamos de esta misma manera fue que accedimos al método estático dentro de nuestra clase, con el uso de la palabra self.

Pero como lo uso o en qué momento lo uso??

Una buena muestra de los métodos y atributos estaticos es el patrón de diseño singleton

<?php
class Ejemplo
{
/*atributos de la clase*/

private static $_instances = null;
private function __construct()
{                     
}
/*otros metodos de la clase*/
public static function getInstance()
{
            if( self::$_instances == NULL ) {
                        self::$_instances = new self();
            }
            return self::$_instances;
}
/*otros metodos de la clase*/
           
}
?>

En palabras sencillas ya que el vinculo da una mayor explicación, la implementación del patrón singleton solo nos permite  que  se pueda crear una instancia única de la clase que estamos trabajando, si se fijan el constructor de la clase es privado por lo que no se puede acceder a él desde fuera de la misma, como se implementaría??

<?php
class Ejemplo
{
/*atributos de la clase*/

private static $_instances = null;
private function __construct()
{                     
}
/*otros metodos de la clase*/
public static function getInstance()
{
            if( self::$_instances == NULL ) {
                        self::$_instances = new self();
            }
            return self::$_instances;
}
public function saludar()
{
      echo “Hola como estas”;         
}         
}
$objeto = Ejemplo::getInstance();
$objeto->saludar();

?>
Este es uno de las implementaciones de los métodos estáticos, espero que el artículo sea de su agrado cualquier aporte o critica lo pueden hacer ya que el echo es que aprendamos todos, un saludo y hasta la próxima entrada.

3 comentarios:

  1. No pedo acceder al vinculo de singleton, podria actualizarlo o bien enviarmelo porfa?

    ResponderEliminar
  2. ola, tenia el error de que cuando agrega el $this en un metodo estatico, asi que puse esos metodos estaticos como metodos normales, es decir les quite el static y aun asi me sigue saliendo el error del $this ¿sabes de casualidad por que razon?

    desde ya muchas gracias

    ResponderEliminar
    Respuestas
    1. $this hace referencia a la instancia de la clase, los métodos estáticos pueden llamarse sin tener una instancia de la misma, por lo que para ellos se usa el self.

      Si tienes un método no estático al que quieres llamar y quiere usar $this, pues simplemente tienes que hacer una instancia de la clase, si puedes poder un poco de código por medio de un gits o un pastebin para ver un poco mas detallado el problema sería más fácil ayudarte, pero por favor por medio de una de las herramientas porque por los comentarios del blog es difícil entender bien el código, saludos

      Eliminar