extract
(PHP 4, PHP 5)
extract — Importa variáveis para a tabela de sÃmbolos a partir de um array
Descrição
Essa função é usada para importar variáveis a partir de um array para a tabela de sÃmbolos corrente. Recebe o array associativo var_array e trata as suas chaves como os nomes das variáveis e os valores como valores das variáveis. Para cada par chave/valor ele criará uma variável na tabela de sÃmbolos corrente, seguindo os parâmetros extract_type e prefix .
Nota: Iniciado com a versão 4.0.5, esta função devolve o número de variáveis extraÃdas.
Nota: EXTR_IF_EXISTS e EXTR_PREFIX_IF_EXISTS foram introduzidas na versão 4.2.0.
Nota: EXTR_REFS foi introduzido na versão 4.3.0.
extract() checa se cada chave do array constitui um nome de variável válido e por colisões com as variáveis já existentes na tabela de sÃmbolos. O modo com que chaves inválidas ou númericas e colisões são tratadas é determinado pelo argumento extract_type . Esse argumento pode receber os seguintes valores:
- EXTR_OVERWRITE
- Se houver uma colisão, sobrescreve a variável existente.
- EXTR_SKIP
- Se houver uma colisão, não sobrescreve a variável existente.
- EXTR_PREFIX_SAME
- Se houver uma colisão, adiciona um prefixo ao nome da variável definido pelo argumento prefix .
- EXTR_PREFIX_ALL
- Adiciona um prefixo ao nome de todas as variáveis definido por prefix . Desde o PHP 4.0.5 estão incluÃdos nomes numéricos.
- EXTR_PREFIX_INVALID
- Adiciona um prefixo definido por prefix apenas para variáveis como nomes inválidos ou numéricos. Essa opção foi adicionada no PHP 4.0.5.
- EXTR_IF_EXISTS
- Só sobrescreve a variável se ela já existe na tabela de sÃmbolos corrente, caso contrário, não faz nada. Isso é útil quando se quer definir uma lista de variáveis válidas e então extrair só as que foram definidas em $_REQUEST, por exemplo. Essa opção foi adicionada no PHP 4.2.0.
- EXTR_PREFIX_IF_EXISTS
- Só cria nomes de variáveis usando o prefixo se na tabela de sÃmbolos já existe uma variável com o nome sem esse prefixo. Essa opção foi adicionada no PHP 4.2.0.
- EXTR_REFS
- Extrai variáveis como referências, ou seja, os valores das variáveis importadas ainda estarão referenciando os valores do parâmetro var_array . Essa opção pode ser usada sozinha ou em conjunto com as outras usando o operador 'ou' em extract_type . Essa opação foi adicionada no PHP 4.3.0.
Se extract_type não for especificado, é assumido o valor EXTR_OVERWRITEpor padrão.
Note que prefix só é necessário se extract_type for EXTR_PREFIX_SAME, EXTR_PREFIX_ALL, ou EXTR_PREFIX_INVALID ou EXTR_PREFIX_IF_EXISTS. Se o nome com o prefixo não for um nome de variável válido, ela não será importada para a tabela de sÃmbolos. Prefixos são automaticamente separados da chave do array pelo caractere underscore.
extract() retorna o número de variáveis importadas com sucesso para a tabela de sÃmbolos.
Não use extract() em dados não confiáveis, como entrada de usuário ($_GET, ...). Se você por exemplo, quer executar um código antigo temporariamente com register_globals, certifique-se de que está usando um dos valores de extract_type que não fazem sobreescrita como EXTR_SKIP e tenha cuidado para que extraia na mesma ordem que é definida em variables_order no php.ini.
Uma possÃvel utilização de extract() é na importação de variáveis contidas num array associativo retornado pela função wddx_deserialize().
Example#1 Exemplo de extract()
<?php
/* Suponha que $var_array é um array retornado pela função
wddx_deserialize */
$tamanho = "grande";
$var_array = array ("cor" => "azul",
"tamanho" => "medio",
"forma" => "esfera");
extract ($var_array, EXTR_PREFIX_SAME, "wddx");
echo "$cor, $tamanho, $forma, $wddx_tamanho\n";
?>
O exemplo acima irá imprimir:
azul, grande, esfera, medio
O $tamanho não foi sobrescrito, porque nós especificamos EXTR_PREFIX_SAME, o que resultou na criação da variável $wddx_tamanho. Se EXTR_SKIP fosse utilizado, então $wddx_tamanho não seria criada. EXTR_OVERWRITE teria feito com que $tamanho tivesse o valor "medio", e EXTR_PREFIX_ALL resultaria em novas variáveis com os nomes $wddx_cor, $wddx_tamanho, e $wddx_forma.
Você deve usar um array associativo, um array indexado numericamente não produzirá resultados a menos que você use EXTR_PREFIX_ALL ou EXTR_PREFIX_INVALID.
Veja também compact().