2010-09-14 12 views
12

Duplicar posibles:
When should I use stdClass and when should I use an array in php5 oo code ??uso de arrays VS objetos para almacenar datos

¿Cuáles son los beneficios de utilizar una de las dos estructuras sobre el otro?

// array 
$user['name'] = 'Emanuil'; 

// object 
$user->name = 'Emanuil'; 
+2

¿Por qué dices 1 es mejor que 2? Yo personalmente no estoy de acuerdo con esa declaración. ¿Puedes explicar por qué crees que 1 es mejor que 2? ¿Estamos hablando de eficiencia, consumo de memoria, práctica de codificación? Eche un vistazo a: http://particletree.com/notebook/object-oriented-php-memory-concerns/ también. – Chris

+0

Solo un consejo: quizás las matrices consumen menos recursos. – fabrik

+0

@Chris: Creo que leí en alguna parte que si necesita una estructura para almacenar datos, entonces 1 es la mejor forma de hacerlo. –

Respuesta

27

matrices

  • Hay toneladas de array_* funciones que pueden trabajar en las matrices, la mayoría de los cuales son muy rápido.
  • Por defecto se pasa por valor (alrededor de copiado)
  • ligeros/simples (cambios único efecto variable local, a menos que pensar)
  • utiliza a menudo para construir una vez que los datos (datos que no cambia)
  • Toda la información es pública
  • Ligeramente menos recursos

objetos

  • Los métodos se pueden utilizar para mantener los datos más estrictos. (ES DECIR.comprueba que un campo se ajusta a un formato)
  • subclases (reduciendo la duplicación de código)
  • Por defecto se pasan por referencia
  • cambios en los datos pueden tener efectos (__get, __set, etc.)
  • A menudo se utiliza para conectar en cascada datos que es más mutable
  • Puede proteger los datos desde el exterior a través de funciones y protegido/variables privadas
  • tipo
  • Función dando a entender de los objetos es más flexible (typehint diferente para diferentes clases)
6

Sólo tiene que ejecutar una prueba sencilla:

$ts_o = microtime(true); 
for($i=0;$i<=1000;$i++) 
{ 
    new stdClass(); 
} 
$total_object = microtime(true) - $ts_o; 

Versus:

$ts_a = microtime(true); 
for($i=0;$i<=1000;$i++) 
{ 
    array(); 
} 
$total_array = microtime(true) - $ts_a; 

y calcule la que resulta.

echo 'Object: ' . $total_object . '/Array: ' . $total_array; 

Resultados: objeto: 0.002635/Matriz: 0,001243

Como se puede ver que las matrices son más rápidos en cuanto a velocidad media, el 46,6% de hecho.

Pero cuando se inicia la adición de variables de repente se dan la vuelta:

$ts_o = microtime(true); 
for($i=0;$i<=1000;$i++) 
{ 
    $var = new stdClass(); 
    $var->booleon = true; 
} 
$total_object = microtime(true) - $ts_o; 
unset($var); 

$ts_a = microtime(true); 
for($i=0;$i<=1000;$i++) 
{ 
    $var = array(); 
    $var['booleon'] = true; 
} 
$total_array = microtime(true) - $ts_a; 

echo 'Object: ' . ($total_object) . '/Array: ' . $total_array; 

Nuevos Resultados: 0,0037809/Matriz: 0.0046189

Hay algunas pruebas que tendría que hacer entonces encontrar su media/modo al final de la prueba para encontrar el que realmente es la mejor entidad.

Puede hacer una prueba en la memoria haciendo un memory_get_usage: http://php.net/manual/en/function.memory-get-usage.php con los mismos principios.

+8

IMO consideraciones de rendimiento no deben tomar una decisión acerca de si usa el uno o el otro. – Gordon

+1

Escritura de prueba para ellos. Prueba pasarlos a funciones. Probar pasar por referencia y modificarlos dentro de la función (pista, con objetos que no necesita pasar por referencia para modificarlos dentro de la función). La creación es probablemente lo menos que se hace con arreglos u objetos. A quién le importa si son baratas de crear si son caras de usar ... Y además, estás hablando de la diferencia de '1x10^-6' ... Si te preocupa esa pequeña ganancia, estás perdiendo tu tiempo. Recuerde, 'la optimización prematura es la raíz de todo mal '... – ircmaxell

+0

¡Pero el rendimiento en general es una parte importante de cualquier aplicación exitosa, y debe abordarse cada vez que se instruye una decisión/implementación! – RobertPitt

5

¿Qué estás haciendo? Ninguna estructura es mejor en todo, y esa es la razón por la cual ambas existen. Por lo tanto, realmente depende de su conjunto de problemas que es "mejor". E incluso entonces, puede ser simplemente un caso que prefiera. Una gran cantidad de arquitectura y diseño de código son las preferencias personales y el estilo.

Ahora, en general, solo hay una vez que usaría un objeto sin método (stdclass, o uno definido a medida) sobre una matriz. Eso es si necesito pasar esos datos por mucho y modificarlos en varios lugares. Con una matriz, tendrá que pasarla por referencia, lo que se vuelve engorroso y puede introducir fuentes de error ... Con un objeto, se pasa como una referencia de objeto por defecto (no una referencia de variable, sino un puntero al mismo objeto). Así que con un arsenal que había necesidad de hacer algo como:

function doSomething($inVar, array &$inOutArray) { 
    $inOutArray['bar'] = 'baz'; 
} 

Para cada función que modifica (o pudiera modificar) la matriz.

Mientras que con un objeto, sólo podía hacer:

function doSomething($inVar, $object) { 
    $object->bar = 'baz'; 
} 

Es más corto (Seguro, sólo un carácter, pero es un personaje en todas partes es posible que desee modificar la matriz). Es menos propenso a errores, ya que si posteriormente se hace $object = new Something(), no va a cambiar el objeto original (ya que no es una referencia variable) ...

El único argumento es que es un poco menos fácil de leer, ya que los espectáculos & explícitamente que tiene la intención de modificar esa variable de entrada. Pero si entiendes cómo funcionan los objetos en PHP 5, no deberías ser tomado por sorpresa (y por lo tanto es una solución aceptable en mi mente) ...

Cuestiones relacionadas