2009-02-13 10 views
8

que actualmente se han fijado mis variables de clase PHP así:¿Cuál es la mejor manera de almacenar variables de clase en PHP?

class someThing { 

    private $cat; 
    private $dog; 
    private $mouse; 
    private $hamster; 
    private $zebra; 
    private $lion; 

    //getters, setters and other methods 
} 

pero también he visto personas que utilizan una única matriz para almacenar todas las variables:

class someThing { 

    private $data = array(); 

    //getters, setters and other methods 
} 

Qué usa usted, ¿y por qué? ¿Cuales son las ventajas y desventajas de cada uno?

Respuesta

11

Generalmente, el primero es mejor por razones que otras personas ya han mencionado aquí.

Sin embargo, si necesita almacenar datos en una clase de forma privada, pero la huella de los miembros de datos es desconocida, a menudo verá su segundo ejemplo combinado con __get() __set() ganchos para ocultar que están siendo almacenado en privado

class someThing { 

    private $data = array(); 

    public function __get($property) 
    { 
     if (isset($this->data[$property])) 
     { 
      return $this->data[$property]; 
     } 
     return null; 
    } 

    public function __set($property, $value) 
    { 
     $this->data[$property] = $value; 
    } 
} 

Entonces, objetos de esta clase se puede utilizar como una instancia de stdClass, solamente ninguno de los miembros que establezca son realmente pública

$o = new someThing() 
$o->cow = 'moo'; 
$o->dog = 'woof'; 
// etc 

Esta técnica tiene sus usos, pero tenga en cuenta que __get() y __set() son del orden de 10-12 veces más lento que el establecimiento de propiedades públicas directamente.

6

Si está utilizando private $data;, allí tiene un montón de datos impenetrables ... Explicarlos explícitamente hará su vida mucho más fácil si está averiguando cómo funciona una clase.

Otra consideración es si utiliza un IDE con autocompletar, eso no funcionará con el segundo método.

1

Si el código es repetitivo, las matrices y los bucles (foreach) son útiles. Debe decidir si el concepto de "animal" en su código es repetitivo o no, o si el código necesita profundizar en la singularidad de cada miembro.

Si tengo que repetirme más de una vez, hago un bucle.

0

Yo prefiero el primer método, por varias razones:

En un buen IDE, las propiedades de la clase aparecen, aunque privado/protegido Es fácil ver lo que ya se ha definido, lo que reduce la posibilidad de que almacene la misma información dos veces. Si el proverbial autobús te golpea en el camino a casa, es mucho más simple que otro desarrollador entre y lea tu código. Y aunque no se aplica a la var privada, sí a vars protegidos, en las clases que amplían esta clase, deberías tratar de evitar el segundo método para la legibilidad pura.

Además, como nota al margen, casi siempre elijo protegido sobre privado a menos que tenga un motivo muy específico para hacerlo privado.

La única vez que probablemente utilizaría el segundo método era si estaba almacenando una colección de muchos de un tipo de cosas.

1
  • Utilice el primer método cuando sepa que necesita esa variable.
  • Utilice el segundo método (una colección de matrices de variables) cuando tenga necesidades variables dinámicas.

Puede combinar estos 2 métodos, por lo que algunas variables están codificadas en su clase, mientras que otras son dinámicas. Las variables codificadas tendrán preferencia en comparación con los métodos mágicos.

Cuestiones relacionadas