2009-08-10 16 views
67

Me estoy actualizando en OOP con PHP y vi un ejemplo de configuración de funciones y/o variables como estáticas. ¿Cuándo y por qué debería establecer una variable/función en estática? He hecho otros idiomas y realmente no recuerdo usar nunca estática, nunca encontré un propósito real para eso. Sé lo que hace, pero ¿por qué no usar una variable en su lugar?¿Cuándo uso variables/funciones estáticas en php?

Respuesta

22

funciones estáticos y variables se utilizan para acceder a las variables/funciones en un ámbito global, como este:

echo myClass::myVariable; 
echo myClass::myFunction(); 

Cuando algo es estático, se puede acceder en cualquier lugar, y es muy similar a una función de tipo procedimental , excepto que puede usar uno mismo y está incluido en el alcance de las clases.

class myClass{ 
    static $myVariable = "myVar"; 
    static function myFunction() 
    { 
     return "myFunc"; 
    } 
} 

Una de las maneras de utilizar esto es mantener solo una instancia de una clase, o un Método Singleton.

class myClass 
    { 
    static $class = false; 
    static function get_connection() 
    { 
     if(self::$class == false) 
     { 
      self::$class = new myClass; 
     } 
     else 
     { 
      return self::$class; 
     } 
    } 
    private function __construct() 
    { 
     // my constructor 
    } 
    // Then create regular class functions. 
    } 

Debido a que tiene un constructor privado, no puede ser instanciado con el operador new, por lo que se ven obligados a llamar myClass::get_connection() para obtener una clase. Esa función puede hacer la nueva clase (porque es un miembro de la clase). Luego almacena la clase en una variable estática, y si vuelve a llamar a la función, simplemente devolverá la clase creada.

Al final, la palabra clave estática se usa para mantener cosas, bueno, estáticas, en referencia al alcance. Significa que no quieres que nada 'cambie' debido al alcance actual. Si bien el método de Singleton se extiende a esto un poco, se mantiene con la misma idea de que siempre tiene la 'misma' clase, no importa cuál sea el alcance que se encuentra.

PHP Documentación
Static Keyword
Scope Resolution Operator

Stackoverflow El conocimiento
How to Avoid Using PHP Global Objects
Share Variables Between Functions in PHP Without Using Globals
Making a Global Variable Accessible For Every Function inside a Class
Global or Singleton for Database Connection
PHP Classes: when to use :: vs. -> ?

+0

¿Qué tiene que ver '=>' con los miembros estáticos? –

+0

Dang it ... pensó que era '->' –

+0

Allí, lo arreglé con el artículo correcto. –

7

Aquí hay un al azar, aunque fairly good description of the differences between static and instance methods.

Desde el puesto de:

métodos de instancia son los métodos de instancia porque se basan en el estado de la instancia de objeto específico. Los métodos de instancia están vinculados a una instancia particular porque el comportamiento que invoca el método depende del estado de esa instancia particular.

Cuando declara un método como estático, define ese método como un método de clase . Se aplica un método de clase a la clase en oposición a cualquier instancia particular de . El comportamiento instigado por un método de clase does no depende del estado de una instancia particular. De hecho, un método estático no puede depender del estado de una instancia ya que los métodos estáticos carecen de acceso a esta referencia .En cambio, el comportamiento de un método de clase depende de un estado que todos los objetos comparten en el nivel de clase, o es independiente de cualquier estado.

Si un método se basa en el estado de una instancia de objeto, debe ser un método de instancia . Si un método es general para todas o ninguna instancia de una clase , y no depende del estado del objeto, debe ser un método estático . Los métodos de instancia son los más comúnmente utilizados. Sin embargo, los métodos estáticos son muy útiles para las clases de utilidad y de fábrica entre muchos otros usos.

51

Se utilizan estática cuando se quiere utilizar un método/variable que no está vinculado a una instancia. Eso puede suceder cuando:

  • no hay ninguna relación con su propósito y una instancia (útil para las cajas de herramientas en idiomas que no permite que cualquier otra cosa programación orientada a objetos como Java, pero no es útil en PHP).

  • Desea controlar el acceso a la instancia. Muy a menudo, la instancia con la que desea tratar no está definida cuando escribe el código, pero estará en ejecución. El Singleton pattern es el mejor ejemplo. Puede usar métodos estáticos como fábricas para crear un objeto de acuerdo con el contexto o compartir recursos con otras instancias. E.G: un miembro estático puede dar acceso a una capa de base de datos para que parte de la aplicación acceda a la misma desde cualquier lugar y se abra/se cierre sin conflictos.

  • Los rendimientos son importantes y el método se ejecutará muchas veces. En ese caso, ahorrará tiempo de CPU impidiendo que el intérprete busque el miembro en una instancia en cada llamada. Pero aún así, si perfs se convierte en un problema tal que llega a esta solución, es posible que sea el momento de reconsiderar su arquitectura, o el uso de un enlace a un lenguaje más rápido para las partes críticas del código.

  • Tiene un método relacionado con un tipo pero que se aplicará a otro. Puede tener sentido escribir el método en la declaración del primer tipo, pero establecerlo estático ya que espera una instancia del otro.

El ejemplo perfecto es un programa de análisis de la secuencia:

class MyObject 
{ 
static function parse($str) 
{ 
    $obj = new MyObject(); 
    // some parsing/setting happens here 
    return $obj; 
} 
} 

// you create an object "MyObject" from a string, so it's more obvious 
// to read it this way : 
$new_obj = MyObject::parse("This a description of a super cool object"); 
+2

En el ejemplo del cuarto caso, en realidad lo está usando como una especie de fábrica, que usaría una función no estática. Y en ese caso, la única verdadera necesidad real de usar la función estática sería el segundo caso con el singleton y todos sus primos de control de instancias. –

10

También es muy útil para el almacenamiento en caché si un método será llamado muy a menudo y hacer exactamente lo mismo, por ejemplo:

/** 
* Returns true if the user is logged in through shibboleth 
* 
* @return boolean true on success, else false 
*/ 
protected function is_logged_in() { 

    //Check shibboleth headers 
    if (!empty($_SERVER['HTTP_SHIB_IDENTITY_PROVIDER']) || !empty($_SERVER['Shib-Identity-Provider'])) { 
     if (!empty($_SERVER[$this->core->dbconfig("shib_auth", self::SHIB_AUTH_CONFIG_UID)])) { 
      return true; 
     } 
    } 
    return false; 
} 

Este método se llamará dentro de mi framework muy a menudo y allí se hará para cada llamada una búsqueda de base de datos para mi configuración $ _SERVER clave

Así, mientras que la página se procesa llamo tal vez 10 veces en una sola carga de la página tendrá 10 llamadas de base de datos, pero lo cambié a:

/** 
* Returns true if the user is logged in through shibboleth 
* 
* @return boolean true on success, else false 
*/ 
protected function is_logged_in() { 
    static $logged_in = null; 
    if($logged_in != null) { 
     return $logged_in; 
    } 

    //Check shibboleth headers 
    if (!empty($_SERVER['HTTP_SHIB_IDENTITY_PROVIDER']) || !empty($_SERVER['Shib-Identity-Provider'])) { 
     if (!empty($_SERVER[$this->core->dbconfig("shib_auth", self::SHIB_AUTH_CONFIG_UID)])) { 
      $logged_in = true; 
      return true; 
     } 
    } 
    $logged_in = false; 
    return false; 
} 

Por lo tanto, sólo echa por cada carga de la página una vez el comportamiento normal si Entré y guardo el resultado en caché. la próxima vez simplemente devolverá el valor en caché. Esta característica la uso muy a menudo para tener más rendimiento.

Espero que esto ayude.

0

visita: http://verraes.net/2014/06/when-to-use-static-methods-in-php/

Los métodos estáticos no son más que las funciones globales de espacios de nombres. El espacio de nombres, creo que todos podemos estar de acuerdo, es genial. En cuanto a las funciones globales: las usamos todo el tiempo. Las funciones nativas en PHP forman nuestros bloques de construcción básicos.

3

En general, utilizando la función estática puede optimizar la velocidad y la memoria y el alcance del método no debe cambiar su debe ser de naturaleza estática y puede acceder a las propiedades estáticas de los objetos, sin iniciarlos guarda la memoria en el tiempo medio.

0

Si desea compartir datos con todas las instancias, como contador para el número de instancias creadas en la ejecución actual.

0

Los elementos estáticos tienen una serie de características que pueden ser útiles.

  1. Primero, están disponibles desde cualquier parte de su script (suponiendo que tenga acceso a la clase). Esto significa que puede acceder a la funcionalidad sin necesidad de pasar una instancia de la clase de un objeto a otro o, lo que es peor, almacenar una instancia en una variable global.

  2. En segundo lugar, una propiedad estática está disponible para cada instancia de una clase, por lo que puede establecer los valores que desea que estén disponibles para todos los miembros de un tipo.

  3. Por último, el hecho de que no necesite una instancia para acceder a una propiedad o método estático le puede evitar instanciar un objeto simplemente para obtener una función simple.