2009-08-22 22 views
34

Haciendo algunas revisiones de código últimamente encontré varias clases que tienen una cantidad significativa de métodos estáticos en ellas ... y parece que no entiendo por qué? De ahí mi pregunta:Cuándo usar el modificador estático en PHP

¿Cuáles son las mejores prácticas con respecto al uso de métodos estáticos en PHP?

¿Cuándo querría usarlas y cuándo no debería usarlas?

¿Cuáles son las diferencias específicas en cómo el tiempo de ejecución maneja los métodos estáticos? ¿Afectan el rendimiento o la huella de memoria?

+1

Nadie ha respondido la última pregunta hasta ahora: "¿Afectan el rendimiento o la huella de memoria?" En general, se desaconseja la estática en Java. No estoy seguro de que esto también sea cierto para el lenguaje de interpretación como PHP. – powerboy

+0

si está haciendo OOP (como ha etiquetado), entonces nunca: http://stackoverflow.com/questions/5167660/static-method-get-is-this-bad-practice/23386464#23386464 –

Respuesta

23

Haciendo un poco de revisiones de código últimamente me encontré con un número de clases que tienen gran número de métodos estáticos en ellos ... y me parece que no puede comprender por qué

PHP no tenía espacios de nombres anteriores a 5.3, por lo que todas las funciones/variables estarían en alcance global a menos que pertenezcan a alguna clase. Ponerlos en una clase como miembros estáticos es una solución para no tener espacios de nombres (y es probable que los haya visto en un número "significativo")

Generalmente, se usan para funciones que no son de mucha utilidad en objetos individuales, pero tiene algún uso a nivel de clase (como se dice en otras respuestas)

+2

Organizar funciones relacionadas como La estática en las clases también explora una poderosa función en PHP: la capacidad de autocargar clases bajo demanda. Si le permite escribir su código sin preocuparse de hacer las inclusiones adecuadas, y sin necesidad de incluir algo que no siempre use. Simplemente llama a tu método estático y el '__autoload()' hace su magia. Codificación limpia, optimizada y funcional. Ni siquiera los espacios de nombres obtuvieron eso todavía. – Havenard

1

No necesita crear una instancia de la clase para usar sus métodos estáticos.

5

métodos estáticos se utilizan para

  • funciones que se relacionan con toda la colección de objetos de la clase dada (por ejemplo singleton pattern)
  • funciones que no están relacionados con cualquier cosa, sino que debe ser sometido a una clase debido OO (por ejemplo, clases de utilidad)
4

método estático no requiere una instancia (y puede devolver una vez) y es más o menos como una función global a excepción de que se ponga en clase espacio de nombres (y por lo tanto, evite collis iones con otras funciones) y tiene acceso a los miembros privados de la clase.

Por lo tanto, úselo cada vez que esté interesado en estas propiedades de la función.

3

No hay nada PHP específico sobre el uso de métodos estáticos.

Los métodos estáticos se pueden invocar directamente en la clase, sin necesidad de crear un objeto instanciado.

De modo que su uso principal es para los métodos que están relacionados con la funcionalidad de las clases, pero no es necesario que una instancia existente sea útil para otros códigos.

Un ejemplo común sería un método de comparación personalizado que se puede pasar a, por ejemplo, la función uasort() para ordenar una matriz de objetos del tipo de clase.

5

La mejor práctica es evitar usarlos siempre que sea posible, ya que eliminan la capacidad de prueba y la capacidad de mantenimiento.Dos grandes lecturas que elaboran:

ACLARACIÓN: No parece haber mucha confusión sobre este tema. La falta de inyección de dependencia es el problema real. Llamar directamente a los métodos estáticos es una de las formas más comunes de caer en esa trampa.

+3

He visto estos argumentos antes, pero no son convincentes. La manera de hacer que los métodos estáticos sean comprobables es no tener efectos secundarios; tales métodos son los más comprobables de todos; les das una entrada, devuelven una salida, eso es todo. La fuerte dependencia de un argumento de clase tampoco tiene peso; agrupar los métodos estáticos relacionados en una clase es el punto completo. –

+1

No abordó la esencia de ambos enlaces: * dependencias *. Ser capaz de anular las funciones dependientes es crucial para las pruebas. Para ser justos, es * posible * hacer esto con funciones estáticas (por ejemplo, tomando dependencias de función como parámetros). Sin embargo, la solución idiomática en PHP es usar una función no estática que puede ser anulada por una subclase. Consulte http://kunststube.net/static/ para obtener más detalles. –

+1

Funciones estáticas escritas correctamente * no tienen ninguna dependencia *, excepto la que se transfiere directamente a la función. Pruebe la función, asegúrese de que tenga el comportamiento esperado, luego úsela en todas las demás pruebas tal como están. Los ejemplos proporcionados en su enlace son un mal uso, ya que llamar a las funciones más de una vez puede producir resultados diferentes cada vez. No lo sé; Simplemente no veo el beneficio de usar métodos 'estáticos' de esa manera. –

2

puede usar métodos estáticos para un mejor rendimiento. no necesita crear objetos para cada usuario que usando su aplicación web y creando objetos con múltiples métodos y propiedades es más lento y necesita muchos más recursos del sistema.

+0

¿Puede agregar una referencia que ofrezca un mejor rendimiento? – Justin

Cuestiones relacionadas