¿Cuándo uso variables / funciones estáticas en php?

Me estoy refrescando en OOP con PHP y vi un ejemplo de configuración de funciones y / o variables como estática. ¿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?

Utiliza estática cuando quiere usar un método / variable que no está vinculado a una instancia. Eso puede suceder cuando:

  • No hay relación con su propósito y una instancia (útil para cajas de herramientas en idiomas que no permiten nada más que OOP como Java, pero no son útiles 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 patrón de Singleton 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. EG: 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.

  • Las actuaciones 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 architecture, 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 statement del primer tipo, pero establecerlo estático ya que espera una instancia del otro.

El ejemplo perfecto es un analizador de cadenas:

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"); 

Las funciones estáticas y la variable se utilizan para acceder a Variables / funciones en un ámbito global, como este:

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

Cuando algo es estático, se puede acceder a él desde cualquier lugar, y es muy similar a una función de tipo de procedimiento, excepto que puede usarlo y está incluido en el scope de las clases.

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

Una de las formas de usar 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. } 

Como tiene un constructor privado, no se puede crear una instancia con el new operador, por lo que se le obliga a llamar a 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 static se usa para mantener cosas, bueno, estáticas, en referencia al scope. Significa que no quieres que nada ‘cambie’ debido al scope actual. Mientras que el método de Singleton se extiende un poco, sigue con la misma idea de que siempre tienes la misma clase, no importa en qué scope estés.

Documentación PHP
Palabra clave estática
Operador de resolución de scope

Conocimiento de StackOverflow
Cómo evitar el uso de objetos globales de PHP
Comparta variables entre funciones en PHP sin usar Globals
Hacer accesible una variable global para cada función dentro de una clase
Global o Singleton para la conexión a la base de datos
Clases de PHP: cuándo usar :: vs. ->?

También es muy útil para el almacenamiento en caché si un método se llamará muy a menudo y hará 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 marco de trabajo muy a menudo y allí hará para cada llamada una búsqueda de base de datos para mi clave $ _SERVER de configuración

Entonces, mientras se procesa la página, llamo tal vez 10 veces en una carga de página, tendrá 10 llamadas a la 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, solo verifique que cada página cargue una vez el comportamiento normal si inicio sesión 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.

Aquí hay una descripción aleatoria, aunque bastante buena de las diferencias entre los métodos estáticos y de instancia .

De la publicación:

Los métodos de instancia son métodos de instancia porque se basan en el estado de la instancia del 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 que un método es estático, define ese método como un método de clase. Un método de clase se aplica a la clase en oposición a cualquier instancia particular. El comportamiento instigado por un método de clase no se basa en el 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.

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

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

Los métodos estáticos no son más que funciones globales con 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.

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

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

  1. En primer lugar, 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. Finalmente, el hecho de que no necesite una instancia para acceder a una propiedad o método estático le puede evitar crear instancias de un objeto simplemente para obtener una función simple.