Métodos y Atributos estáticos

Al igual que en Java o C# en PHP 5 se ha introducido la posibilidad de definir atributos y métodos de clase estáticos aplicando la palabra reservada **static** a la definición del método o del atributo.

Los métodos de clase pueden ser invocados sin necesidad de haber creado ningún objeto de la clase en memoria, por lo que dentro de ellos no podremos usar la referencia implícita al objeto $this, ni podremos hacer referencia a atributos de la clase no estáticos. Para hacer referencia a los atributos propios de una clase usaremos la palabra reservada **self** (sin el $).

Como vemos en el ejemplo los atributos estáticos serán como variables globales que perdurarán en memoria más allá de cualquier instancia de objeto de la clase y como hemos mencionado podremos usarlos sólo dentro de métodos de clase.

Ejemplo sencillo

<?php
   class Math {
      const pi = 3.14159;
      static function squared($input) {
         return $input*$input;
      }
      static function multPorPi($valor) {
         return self::pi * $valor;
      }
   }
   echo Math::squared(8); //64
   echo Math::multPorPi(2); //6.28318
?>

Ejemplo más complejo

<?php
   class NombreClase {
      static public $sAtributo1 = 'Atributo 1'; public $Atributo2;
      function __construct() {
         $this->Atributo2 = 'Atributo 2';
      }
      public function Metodo1() {
         //No permitido por ser un atributo estatico no es accesible desde $this.
         echo $this->sAtributo1 . '<br>';
         // Permitido porque es si accedieramos a una variable global
         // Estaremos modificando la variable estatica para cualquier
         // instancia del objeto.
         self::$sAtributo1 .= '_DENTRO';
         // Permitido por ser un atributo no estatico.
         $this->Atributo2 .= '_DENTRO';
         echo $this->Atributo2 . '<br>';
      }
      public static function Metodo2() {
         // Permitido por tratarse de un atributo estatico.
         echo self::$sAtributo1 . '<br>';
         // No permitido pues no existe $this en metodos estaticos
         // y tampoco podemos acceder a un atributo no estatico.
         echo $this->Atributo2 . '<br>';
      }
   }
   //No permitido por no ser un meeodo de clase.
   NombreClase::Metodo1();
   //Permitido por tratarse de un metodo estatico.
   NombreClase::Metodo2();
   //Permitido porque es como si accedieramos a una variable global
   // Estaremos modificando la variable estatica PUBLICA para cualquier
   // instancia del objeto.
   NombreClase::$sAtributo1 .= '_FUERA1';
   // Instanciamos la clase.
   $objeto = new NombreClase();
   //No permitido pues es un atributo estatico.
   $objeto->sAtributo1 .= '_FUERA2';
   //Permitido pues es un atributo publico no estatico y la clase esta instanciada.
   $objeto->Atributo2 .= '_FUERA';
   //Permitido pues la clase ya esta instanciada.
   $objeto->Metodo1();
   //Permitido aunque sea un objeto instanciado y el metodo sea estatico.
   $objeto->Metodo2();
?>

results matching ""

    No results matching ""