2012-06-15 10 views
5

¿Está utilizando una instancia de una clase para acceder a métodos estáticos considerados como mala práctica?¿Está utilizando una instancia de una clase para acceder a métodos estáticos considerados como mala práctica?

I.e.

$model = new MyClass(); 
$options = MyClass::getOptions(); 

vs

$model = new MyClass(); 
$options = $model::getOptions(); 

($model se instancia en cualquiera de los casos, sólo estoy preguntando si un enfoque es preferible a la otra.)

+0

segunda sintaxis no es válida: s –

+0

@SiGanteng el IDE no se queja, y se ejecuta ... – bcmcfc

+0

bien entonces, mi culpa, lo siento –

Respuesta

4

Tradicionalmente, la primera forma (especificando la clase name itself) tiene más similitudes con otros lenguajes como Java.

El segundo es exclusivo de PHP (afaik); funciona porque el operador :: desambigua la expresión, a diferencia de Java, donde se usa un período tanto para la instancia como para las propiedades estáticas.

No estoy seguro de cuál es el impacto en el rendimiento al usar la segunda opción, pero creo que se trata de estándares personales de gusto/codificación.

Conclusión

Si los tipos de los casos son inmediatamente claro a partir del código que rodea puede ser que sea más fácil ir por la segunda opción (a veces el nombre de clase puede ser bastante grande); pero si no, usa la primera opción ya que es la más explícita.

3

Eso depende, creo. Puede felizmente usar métodos estáticos durante muchos años felices, disfrutando de código libre de instancias, pero un día tendrá que reenrutar algunas llamadas al (es decir, a dónde va) a otra clase descendiente, tan simple llamada de búsqueda y reemplazo no va a hacer) Así que ir con un objeto preparado es una ruta más segura, creo.

Como alternativa, se puede usar algo como esto:

$className = 'MyClass'; 
$className::classyMethod1(); 
$className::classyMethod2(); 

... pero que puede llegar a ser bastante confuso con el tiempo, supongo (y es utilizable sólo en PHP 5.3+)

1

creo que, esta alternativa:

$options = MyClass::getOptions(); 

realidad está perdiendo menos memoria, porque no se está necesitando una variable adicional para llamar a la función estática.

Cuestiones relacionadas