Atribuir array () antes de usar uma variável como matriz

Eu tentei encontrar um título apropriado e explicativo, mas não pude e vou tentar explicar o que estou perguntando aqui:

Normalmente, se você não atribuir uma matriz vazia a uma variável, você pode começar a atribuir valores a índices como este:

$hello["world"] = "Hello World"; ... echo $hello["world"]; 

mas eu sempre encontro essa definição:

 $hello = array() //assigning an empty array first $hello["hello"] = "World"; ... echo $hello["hello"]; 

Por que é usado muito. Existe um ganho de desempenho ou algo com o segundo?

Obrigado.

Duas razões:

  • Melhor legibilidade (você sabe que a matriz está inicializada neste momento)
  • Segurança – quando executado em um sistema com register_globals habilitado, um usuário poderia adicionar, por exemplo, hello[moo]=something para a seqüência de consulta e a matriz já seria inicializada com isso. $hello = array(); Substitui esse valor, uma vez que uma nova matriz é criada.

Inicializar suas variables ​​é uma boa prática .
Tomemos, por exemplo, isso:

 $foo = 'bar'; // 10 lines and 1 year later $foo['baz'] = 'test'; 

Parabéns, agora você tem a string "tar" .

Isso pode acontecer acidentalmente e introduzir insetos desnecessários. Piora com a criação de variables ​​condicionais. É evitado facilmente ao entrar no bom hábito de inicializar explicitamente suas variables.

 $hello = array(); if(someConditionIsTrue){ $hello["world"] = "Hello World"; } foreach($hello as $val){ // this will not give you any error or warning. echo $val; } 

Mas

 if(someConditionIsTrue){ $hello["world"] = "Hello World"; } foreach($hello as $val){ // this will give you error . echo $val; } 

Se eu me lembro corretamente, o primeiro produzirá um aviso por parte do PHP se você tiver error_reporting como E_ALL . Você sempre deve usar o segundo método porque inicializa explicitamente uma nova matriz. Se você estiver olhando através do código e do nada, veja $hello["hello"] mas não lembro de ter visto qualquer referência a $hello antes, seria confuso.

O mesmo acontecerá se você fizer $hello[] = "World" , um aviso será exibido