extractImportar variables a la tabla de símbolos actual desde un array
&reftitle.description;
intextractarrayvar_arrayintextract_typeEXTR_OVERWRITEstringprefix
Importa variables desde un array a la tabla de símbolos actual.
Comprueba cada clave para ver si tiene un nombre de variable válido.
También comprueba las colisiones con las variables existentes en
la tabla de símbolos.
&reftitle.parameters;
var_array
Un array asociativo. Esta función trata a las claves como nombres de variables y
a los valores como valores de variables. Por cada par clave/valor creará una
variable en la tabla de símbolos actual, sujeta a los parámetros
extract_type y
prefix.
Se debe usar un array asociativo; un array indexado numéricamente
no producirá resultados a menos que se use EXTR_PREFIX_ALL o
EXTR_PREFIX_INVALID.
extract_type
La manera en que las claves no-válidas/numéricas y las colisiones son tratadas está determinda
por el parámetro extract_type. Puede ser uno de los
valores siguientes:
EXTR_OVERWRITE
Si hay una colisión, sobrescribe la variable existente.
EXTR_SKIP
Si hay una colisión, no sobrescribe la variable
existente.
EXTR_PREFIX_SAMESi hay una colisión, prefija el nombre de la variable con
prefix.
EXTR_PREFIX_ALL
Prefija todos los nombres de variables con
prefix.
EXTR_PREFIX_INVALID
Sólo prefija los nombres de variables no-válidas/numéricas con
prefix.
EXTR_IF_EXISTS
Sobrescribe la variable sólo si ya existe en la
tabla de símbolos actual, de otro modo no hace nada. Esto es útil
para definir una lista de variables válidas y después extraer
sólo aquellas variables que se definieron fuera de
$_REQUEST, por ejemplo.
EXTR_PREFIX_IF_EXISTS
Crea nombres de variables con prefijo sólo si la versión no prefijada
de la misma variable existe en la tabla de símbolos actual.
EXTR_REFS
Extrae las variables como referencias. Esto significa que los
valores de las variables importadas están todavía referenciados por los valores del
parámetro var_array. Se puede usar esta bandera
por sí misma o combinarla con cualquier otra bandera usando el operador OR en
extract_type.
Si no se especifica extract_type, se asume
que es EXTR_OVERWRITE.
prefix
Observe que prefix sólo es requerido si
extract_type es EXTR_PREFIX_SAME,
EXTR_PREFIX_ALL, EXTR_PREFIX_INVALID
o EXTR_PREFIX_IF_EXISTS. Si
el resultado prefijado no es un nombre de variable válido, ésta no es
importada a la tabla de símbolos actual. Los prefijos son separados de las
claves del array mediante un caracter de subrayado.
&reftitle.returnvalues;
Devuelve el número de variables importadas con éxito a la tabla de
símbolos.
&reftitle.changelog;
&Version;&Description;4.3.0
Se añadió EXTR_REFS.
4.2.0
Se añadieron EXTR_IF_EXISTS y EXTR_PREFIX_IF_EXISTS.
4.0.5
Esta función ahora devuelve el número de variables extraídas.
Se añadió EXTR_PREFIX_INVALID.
EXTR_PREFIX_ALL también incluye variables numéricas.
&reftitle.examples;
Ejemplo de extract
Un posible uso de extract es importar a la
tabla de símbolos las variables contenidas en un array asociativo devuelto por
wddx_deserialize.
"azul",
"tamaño" => "medio",
"forma" => "esfera");
extract($var_array, EXTR_PREFIX_SAME, "wddx");
echo "$color, $tamaño, $forma, $wddx_tamaño\n";
?>
]]>
&example.outputs;
El $tamaño no se ha sobrescrito ya que se especificó
EXTR_PREFIX_SAME, lo que resulta en
la creación de $wddx_tamaño. Si se hubiera especificado
EXTR_SKIP, $wddx_tamaño no se habría creado.
EXTR_OVERWRITE causaría que $tamaño tuviera
el valor "medio", y EXTR_PREFIX_ALL resultaría en variables nuevas
llamadas $wddx_color,
$wddx_tamaño, y
$wddx_forma.
&reftitle.notes;
No use extract en datos que no son de confianza, como
las entradas de usuario
(esto es, $_GET, $_FILES, etc.).
Si lo hace, por ejemplo si quiere ejecutar código antiguo que cuenta
con register_globals
temporalmente, asegúrese de usar uno de los valores de
extract_type que no sobrescriban, como
EXTR_SKIP, y sepa que debería realizar la extracción
en el mismo orden que fue definido en
variables_order dentro de
&php.ini;.
Si
tiene register_globals
activado y usa extract
en $_FILES y
especifica EXTR_SKIP, puede obtener resutados
no deseados.
Esto es una práctica no recomendada y sólo está documentada aquí por razones de
complementación. El uso de
register_globals está
obsoleto y las llamadas a extract en información que no es
de confianza tal como $_FILES es, como se observó arriba, un
riesgo potencial de seguridad. Si se encuentra con esto, significa
que está usando al menos dos malas prácticas de código.
]]>
Se esperaría ver algo como lo siguiente:
string(10) "somefile.txt"
["type"]=>
string(24) "application/octet-stream"
["tmp_name"]=>
string(14) "/tmp/phpgCCPX8"
["error"]=>
int(0)
["size"]=>
int(4208)
}
string(14) "/tmp/phpgCCPX8"
]]>
Sin embargo, en su lugar se ve algo como esto:
Esto es a causa del hecho de que,
ya que register_globals está
activado, $archivoprueba ya existe en el
ámbito global cuando se llamó a extract. Y
ya que EXTR_SKIP está
especificado, $archivoprueba no es sobrescrito con
el contenido del array $_FILES
por lo que $archivoprueba permanece como cadena.
Ya que a las cadenas se puede
acceder usando la sintaxis de array y la cadena no numérica
tmp_name es interpretada como
0, PHP
ve $archivoprueba['tmp_name']
como $archivoprueba[0].
&reftitle.seealso;
compact