2011-01-13 12 views
7

Hace poco respondieron a esta pregunta:Además de singletons, ¿cuáles son algunas de las razones convincentes para usar métodos estáticos en PHP?

What are good reasons to use static methods in PHP?

El primero que viene a la mente, por supuesto, era un producto único. Con poca excepción, los otros contestadores proporcionaron el mismo ejemplo único. Pero eso me hizo pensar ... ¡Realmente nunca utilizo métodos o propiedades estáticos para nada además de crear singletons!

Una breve búsqueda captó muchos tutoriales sobre el uso de métodos estáticos, y casi todos implementan alguna variación de la misma clase singleton.

Estoy realmente interesado: ¿Qué razón tenemos para crear métodos estáticos distintos a la creación de singleton (o algo más que simplemente ser perezoso y querer una función global)?

¿Alguien tiene un ejemplo pragmático de utilizar un método estático que no podría lograrse mejor utilizando un patrón de diseño dinámico? El ejemplo puede ser un singleton si tiene sentido en su contexto, pero estoy interesado en otras razones además del aspecto singleton de la solución.

Respuesta

6

Un patrón de fábrica normalmente utilizar una llamada estática, así; pero es sensato usar métodos estáticos para cualquier clase mathod que no tenga dependencias en las propiedades de la instancia u otros métodos de instancia, especialmente cuando se llaman regularmente, por razones de rendimiento.

El lugar lógico para el siguiente método en PHPExcel es en la clase PHPExcel_Cell, porque se relaciona directamente con la manipulación de una dirección de celda (cualquier dirección de celda, no solo la dirección de una instancia específica), pero no tiene dependencia del ejemplo, entonces lo declaro estático.

public static function stringFromColumnIndex($pColumnIndex = 0) { 
    if ($pColumnIndex < 26) { 
     return chr(65 + $pColumnIndex); 
    } elseif ($pColumnIndex < 702) { 
     return chr(64 + ($pColumnIndex/26)).chr(65 + $pColumnIndex % 26); 
    } 
    return chr(64 + (($pColumnIndex - 26)/676)).chr(65 + ((($pColumnIndex - 26) % 676)/26)).chr(65 + $pColumnIndex % 26); 
} 

Y este método no es particularmente difícil de probar

+0

¿Y cómo exactamente me burlo de la función estática para esto cuando estoy probando otro objeto que usa esto? –

+0

¡Oh! Había olvidado que solo había una verdadera metodología de prueba –

+0

@Mark James plantea una pregunta válida. Y yo diría que es interesante para cualquiera que quiera usar PHPExcel en sus propios proyectos saber cómo los creadores sugieren probarlo. – Gordon

3

No se trata necesariamente de patrones. PHP no es un entorno persistente, por lo que la vida útil de cualquier instancia de objeto probablemente sea de milisegundos, pero requiere asignación/liberación de memoria y ciclos de CPU adicionales. A menos que necesite objetos o colecciones reutilizables, encuentro objetos no estáticos que tienen poca justificación.

+0

me encantaría ver su unidad de pruebas – Gordon

+0

Lo sentimos, no se puede, porque yo no uso ninguna. Aún así, ninguno de los más de 50 sistemas cliente instalados en los últimos dos años experimentó ningún problema :) –

+2

¿No es usted el súper codificador? – Stephen

2
+0

+1 y lo mismo es cierto para [Singletons] (http://stackoverflow.com/questions/4595964/who-needs-singletons/4596323#4596323). Evita ambos althogether. – Gordon

+0

Singletonitis: la plaga de los diseños dudosos –

+0

+1 ¡buen conjunto de enlaces! Buena lectura. – Stephen

Cuestiones relacionadas