extractImportar variables a la tabla de símbolos actual desde un array
&reftitle.description;
intextractarrayarrayintflagsEXTR_OVERWRITEstringprefix&null;
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;
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 flags 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.
flags
La manera en que las claves no-válidas/numéricas y las colisiones son tratadas está determinda
por el parámetro flags. 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 array. Se puede usar esta bandera
por sí misma o combinarla con cualquier otra bandera usando el operador OR en
flags.
Si no se especifica flags, se asume
que es EXTR_OVERWRITE.
prefix
Observe que prefix sólo es requerido si
flags 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.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 temporalmente código antiguo que
dependía de register_globals
temporalmente, asegúrese de usar uno de los valores de
flags 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 aún
tiene register_globals
y está activado, si utiliza 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;
compactlist