Derreferenciamento de arrays e strings constantes no PHP

Artigo que explica o que é o derreferenciamento de arrays e strings e sobre o novo recurso do PHP 5.5 para derreferenciamento de arrays e strings constantes.

Introdução

No artigo anterior, postei sobre o anúncio do PHP 5.5.0 alpha, citando as novidades da futura versão do PHP. Neste artigo, veremos sobre a melhoria "Derreferenciamento de arrays e strings constantes" (constant array/string dereferencing). Não se assuste com o nome, pois é uma melhoria simples de entender.

Derreferenciamento de arrays

O derreferenciamento de arrays, nada mais é do que o acesso a uma posição do array. Até a versão 5.3, só podiamos acessar uma posição de um arrray utilizando o operador colchetes sobre uma variável do tipo array. Por exemplo:

$a = array(1, 2, 3);

echo $a[1]; // Derreferenciando a posicao 1

Na versão 5.4, foi introduzido o suporte ao derreferenciamento de arrays retornados por métodos/funções. Ou seja, quando um método ou função retornava um valor do tipo array, poderiamos usar o colchetes diretamente após a chamada. Por exemplo:

// Funcao que retorna um array
function obter_array() {
    return array(1, 2, 3);
}

echo obter_array()[1]; // Derreferenciando a posicao 1 do retorno da funcao

E, finalmente, na versão 5.5, será possível derreferenciar arrays "constantes", ou seja, derreferenciar uma posição do array durante a própria declaração do array. Por exemplo:

echo array(1, 2, 3)[1]; // Derreferenciando a posicao 1 do array

Podemos usar este recurso quando temos um conjunto de valores conhecido, mas queremos obter um deles dinamicamente. Por exemplo:

// obtemos o ID da cor dinamicamente (1 ou 2)
$id_cor_desejada = (int)$_GET['id_cor_desejada'];

// Obtemos o valor dentro do conjunto conhecido
$cor_desejada = array(1 => '#FF0000', 2 => '#0000FF')[$id_cor_desejada];

Neste caso, o array não fica na memória após a execução da linha, trazendo uma economia de memória. Além disso, este derreferenciamento é um pouco mais rápido, provavelmente porque não é preciso atribuir o array a uma variável para depois acessar uma posição dela.

Note que este recurso também vale para derreferenciamento de arrays associativos (hash tables), que utilizam strings na indexação:

echo array('a' => 123, 'b' => 456, 'c' => 789)['b']; // derreferenciando a posicao 'b'

E também derreferenciar matrizes constantes:

echo array(
    array(1, 2, 3),
    array(4, 5, 6),
    array(7, 8, 9)
)[1][0]; // derreferenciando a posicao [1][0], exibindo o valor "4"

Vale lembrar que, no PHP 5.4, podemos criar arrays de forma simplificada, usando os colchetes, e também podemos derreferenciá-los diretamente:

echo ['a', 'b', 'c'][1]; // Derreferenciando a posicao 1 do array

Derreferenciamento de strings

Bom, o derreferenciamento de strings segue a mesma lógica de arrays. A diferença é que acessamos um caractere da string ao invés de uma posição do array.

Até a versão 5.3:

$str = 'Brasil vence Argentina';
echo $str[3];

Na versão 5.4:

function get_mensagem() {
    return 'Dia 23 de novembro tem black friday';
}

echo get_mensagem()[3];

Na versão 5.5:

echo "Fifa 13 para PS3 ou XBOX 360 é bom demais"[3];

O derreferenciamento de strings pode ser útil para obter um caractere dinamicamente, dentro de uma lista de caracteres conhecida. Acredito que seja um pouco mais raro do que o derreferenciamento de arrays, mas acho que vale a pena para manter a consistência do operador colchetes (ter o mesmo efeito em arrays e strings).

2 comentários

Unknown disse...

Ótimo post! Consegui entender perfeitamente como funciona o Derreferenciamento de arrays e strings constantes.

Valeu!