2010-03-08 17 views
23

¿Está bien usar array sin quotion simple o doble como $ array [key]? Pensé que era malo porque PHP busca constante primero si no uso una comilla simple o doble. Uno de mis colegas me dijo que no importa.¿Está bien usar array [key] en PHP?

¿Qué piensan?

+3

¿Quizás su colega quiso decir que no importa si se usan comillas simples o dobles? Porque eso sería más o menos cierto (excepto que las variables no se analizan en comillas simples). –

Respuesta

42

No se considera OK, incluso si funciona en la mayoría de los casos.


Básicamente, cuando PHP ve esto:

echo $array[key]; 

Se buscará una constante, definida con define, llamado key - y, si no hay ninguno, si tomará el valor 'key' .


Pero, si hay algo como esto antes en su código:

define('key', 'glop'); 

no va a tomar

echo $array['key']; 

más; en cambio, que va a utilizar el valor de la constante key - y su código será el mismo que:

echo $array['glop']; 


Al final, no poner comillas arround el nombre de la clave es malo para al menos dos razones:

  • Existe el riesgo de que no va a hacer lo que se espera - que es muy malo
    • Podría, hoy ...
    • ¿Pero qué pasa con la próxima semana/mes/año?
    • Tal vez, un día, se le define una constante con el nombre equivocado ;-)
  • No es bueno para el rendimiento:
    • tiene que buscar una constante, antes de usar 'key'
    • y, como se dijo en un comentario, se genera avisos (incluso si se desactiva error_reporting y display_errors, los avisos/advertencias/errores se siguen generando, incluso si descarta más adelante)

Por lo tanto: no se debe escuchar a ese tipo en este punto: él está equivocado: sí importa.


Y si necesita un poco de "prueba" de que es "mejor" que lo que la gente le puede decir en stackoverflow, se le puede indicar a esta sección del manual, como referencia: Why is $foo[bar] wrong?

+3

Además, cada vez que PHP ve esta sintaxis, arroja un E_NOTICE, que tiene una sobrecarga de rendimiento. Y probablemente escribe algo de spam en su registro. Porque debe iniciar sesión y resolver los errores de nivel de aviso. –

+3

+1 no usar comillas para las teclas de matriz es estúpido y está destinado a causar problemas algún día. –

+0

@Frank: verdadero; una buena razón más para usar las comillas cuando deberían estar allí! –

2

Es bad practice para no citar valores clave, por varias razones:

  1. colisiones potenciales con los nombres de símbolos significativos, tales como define 'd constantes.
  2. Algunas teclas no se pueden expresar sin citar (por ejemplo, la clave "]").
  3. Los malos hábitos pueden morderte más adelante (concretamente en lo que respecta a los números 1 y 2).
  4. Rendimiento: la búsqueda de define lleva tiempo.

Si tienes intención de evitar tener que escribir comillas alrededor de los nombres que son elementos estándar de solo una cosa que está pasando alrededor de un lote, tal vez es posible que desee utilizar los objetos en su lugar, que tienen una sintaxis object->property en lugar de una $array["element"] sintaxis.

2

A menos la clave en realidad es una constante, no hay ninguna razón para que no ponga comillas alrededor de la tecla.

La forma en que PHP funciona es que busca el valor constante de lo que has puesto, pero toma la representación de cadena si no se puede encontrar la constante.

Si alguien editara su código más adelante y agregara una constante con ese nombre de clave, solo causaría más dolores de cabeza.

6

Ésta es no bien y añadir a lo que han dicho, se activará un error en la mayoría de los casos:

8 Notice Use of undefined constant key - assumed 'key' in file: 'index.php' on line 46 

Ver la sección en el PHP Manual para "¿Por qué es $ foo [bar] ¿incorrecto?" bajo "matriz de hacer y no hacer" en esta página: http://php.net/manual/en/language.types.array.php

3

Desde el PHP Manual - Why is $foo[bar] wrong?

Siempre use comillas alrededor de una cadena literal índice de matriz. Por ejemplo, $ foo ['bar'] es correcto, mientras que $ foo [bar] no lo es. ¿Pero por qué? Es común encontrar este tipo de sintaxis en los scripts viejos:

<?php 
$foo[bar] = 'enemy'; 
echo $foo[bar]; 
// etc 
?> 

Esto está mal, pero funciona. La razón es que este código tiene una constante (barra) indefinida en lugar de una cadena ('barra' - observe las comillas). PHP puede en el futuro definir constantes que, desafortunadamente para dicho código, tienen el mismo nombre. Funciona porque PHP convierte automáticamente una cadena vacía (una cadena sin comillas que no corresponde a ningún símbolo conocido) en una cadena que contiene la cadena vacía. Por ejemplo, si no hay definida una constante llamada barra, entonces PHP sustituirá en la cadena 'barra' y usará eso.

Hay más ejemplos en el manual que puede consultar.

4

Esto está mal y se auto-definir una constante:

$var = $array[bar]; 

Este uso es correcto, sin embargo:

$var = "string $array[bar] ..."; 

Para la compatibilidad con el PSP2 esta sintaxis de edad todavía se permite en el contexto de cadena. Citar la clave llevaría a un error de análisis, a menos que también use {llaves} alrededor de ella.

Cuestiones relacionadas