diff --git a/language/variables.xml b/language/variables.xml index 5a34c061f..131cf020c 100644 --- a/language/variables.xml +++ b/language/variables.xml @@ -1,6 +1,6 @@ - + Variables @@ -15,16 +15,20 @@ Los nombres de variables siguen las mismas reglas que otras etiquetas en - PHP. Un nombre de variable válido tiene que empezar con una letra o un - carácter de subrayado (underscore), seguido de cualquier número de + PHP. Un nombre de variable válido tiene que empezar con una letra + (A-Z, a-z, o los bytes del 128 al 255) + o un carácter de subrayado (underscore), seguido de cualquier número de letras, números y caracteres de subrayado. Como expresión regular se podría expresar como: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*' - Para los propósitos de este manual, una letra es a-z, A-Z, y los bytes - del 127 al 255 (0x7f-0xff). + PHP no soporta Unicode en el nombre de las variables, + PHP no admite nombres de variables Unicode, sin embargo, algunas codificaciones + de caracteres (como UTF-8) codifican caracteres de tal manera que todos los bytes + de un carácter multibyte están dentro del rango permitido, convirtiéndolo así + en un nombre de variable válido. @@ -32,6 +36,8 @@ $this es una variable especial que no puede ser asignada. + Antes de PHP 7.1.0, era posible la asignación indirecta (por ejemplo, + mediante el uso de variables variables). @@ -42,8 +48,8 @@ Referencia de Funciones de Variables. - - + + Nombres de variables válidos y no válidos ]]> - - + + + + PHP acepta una secuencia de bytes como nombre de variable. Los nombres de + variables que no siguen las reglas de nombres mencionadas anteriormente + solo pueden accederse de forma dinámica en tiempo de ejecución. Consulte + variables variables + para obtener información sobre cómo acceder a ellas. + + + + Cómo acceder a nombres de variables con caracteres no válidos + + +]]> + + &example.outputs; + + + + + De forma predeterminada, las variables siempre se asignan por valor. Esto @@ -123,9 +156,11 @@ $bar = &test(); // Inválido. No es necesario inicializar variables en PHP, sin embargo, es una muy buena práctica. - Las variables no inicializadas tienen un valor predeterminado de acuerdo a su tipo dependiendo del contexto en el que son usadas - - las booleanas se asumen como &false;, los enteros y flotantes como cero, las cadenas (p.ej. usadas en echo) se - establecen como una cadena vacía y los arrays se convierten en un array vacío. + El acceso a una variable no definida generará un E_WARNING + (en versiones anteriores a PHP 8.0.0, E_NOTICE). + Una variable no definida tiene un valor predeterminado de &null;. + Se puede utilizar la construcción del lenguaje isset + para detectar si una variable ya se ha inicializado. @@ -133,89 +168,79 @@ $bar = &test(); // Inválido. +]]> + + &example.outputs; + + + + + -// Uso booleano; imprime 'false' (Vea operadores ternarios para más información sobre esta sintaxis) -echo($booleano_indefinido ? "true\n" : "false\n"); - -// Uso de una cadena; imprime 'string(3) "abc"' -$cadena_indefinida .= 'abc'; -var_dump($cadena_indefinida); - -// Uso de un entero; imprime 'int(25)' -$int_indefinido += 25; // 0 + 25 => 25 -var_dump($int_indefinido); - -// Uso de flotante/doble; imprime 'float(1.25)' -$flotante_indefinido += 1.25; -var_dump($flotante_indefinido); - -// Uso de array; imprime array(1) { [3]=> string(3) "def" } -$array_indefinida[3] = "def"; // array() + array(3 => "def") => array(3 => "def") -var_dump($array_indefinida); - -// Uso de objetos; crea un nuevo objeto stdClass (vea http://www.php.net/manual/en/reserved.classes.php) -// Imprime: object(stdClass)#1 (1) { ["foo"]=> string(3) "bar" } -$objeto_indefinido->foo = 'bar'; -var_dump($objeto_indefinido); + + PHP permite la autovivificación de array (creación automática de un nuevo array) + a partir de una variable no definida. + Añadidiendo un elemento a una variable no definida creará un nuevo array y + no producirá ninguna advertencia. + + + Autovivification de un array a partir de una variable no definida + + ]]> - - - Depender del valor predeterminado de una variable sin inicializar es problemático - al incluir un archivo en otro que use el mismo nombre de variable. - Un error de nivel E_NOTICE es - emitido cuendo se trabaja con variables sin inicializar, con la excepción del caso en - el que se anexan elementos a un array no inicializado. La construcción del lenguaje isset - puede ser usada para detectar si una variable ya ha sido inicializada. - - + + + + Depender del valor predeterminado de una variable sin inicializar + es problemático al incluir un archivo en otro que use el mismo + nombre de variable. + + + + + Una variable puede ser destruida, utilizando la construcción del lenguaje + unset. + + + + Para información con funciones relativas a variables, mira la + Referencia de funciones de variables. + + Variables Predefinidas - PHP proporciona una gran cantidad de variables predefinidas a cualquier - script que se ejecute. Muchas de éstas, sin embargo, no pueden ser - completamente documentadas ya que dependen del servidor que esté - corriendo, la versión y configuración de dicho servidor, y otros - factores. Algunas de estas variables no estarán disponibles cuando se - ejecute PHP desde la línea de - comandos. Para obtener una lista de estas variables, por favor vea - la sección sobre Variables Predefinidas Reservadas. - - - - PHP ofrece un conjunto adicional de arrays predefinidas que - contienen variables del servidor web, el entorno y - entradas del usuario. Estos nuevos arrays son un poco especiales porque - son automáticamente globales. Por esta razón, son conocidas a menudo como - "superglobales". Las superglobales se mencionan más abajo; sin embargo - para una lista de sus contenidos y más información sobre variables - predefinidas en PHP, por favor consulte la sección Variables predefinidas reservadas. - Asimismo, podrá notar cómo las antiguas variables predefinidas - ($HTTP_*_VARS) todavía existen. - + PHP proporciona una gran cantidad de + variables predefinidas. + PHP ofrece un conjunto adicional de arrays predefinidas que contienen + variables del servidor web (cuando es aplicable), el entorno y entradas del + usuario. Estos arrays están automáticamente disponibles en cualquier + entorno. Por esa razón, a veces son conocidas como "superglobales". + (No existe mecanismo en PHP para crear superglobales definidas por el + usuario). Referencia de la + lista de superglobales + para más detalles. Variables variables Las superglobales no pueden ser usadas como variables variables al - interior de funciones o métodos de clase. - - - - - - Aún cuando las superglobales y HTTP_*_VARS pueden existir al mismo - tiempo; estas variables no son idénticas, así que modificar una no - cambia la otra. + linkend="language.variables.variable">variables variables + en el interior de funciones o métodos de clase. @@ -231,63 +256,78 @@ var_dump($objeto_indefinido); Ámbito de las variables - El ámbito de una variable es el contexto dentro del que la variable está - definida. La mayor parte de las variables PHP sólo tienen un ámbito - simple. Este ámbito simple también abarca los ficheros incluídos y los - requeridos. Por ejemplo: - - - + El ámbito de una variable es el contexto en el cual la variable está + definida. + PHP tiene un ámbito de función y un ámbito global. + Cualquier variable difinida fuera de una función está limitada al ámbito global. + Cuando se incluye un archivo, el código contenido hereda el ámbito de la + variable de la línea en la cual se incluye el archivo. + + + Ejemplo de una variable de ámbito global + ]]> - - - - Aquí, la variable $a estará disponible al interior del - script incluido b.inc. Sin embargo, al interior de - las funciones definidas por el usuario se introduce un ámbito local a la - función. Cualquier variable usada dentro de una función está, por - omisión, limitada al ámbito local de la función. Por ejemplo: - + + - - + + Cualquier variable declarada dentro de una función o una + funcíón anónima + está limitada al ámbito del cuerpo de dicha función. + Sin embargo, las + funciones de flecha + vinculan las variables desde el ámbito padre haciendo que + estén disponibles dentro de la función. + Si se incluye un archivo dentro de una función, las variables + contenidas en el archivo llamado estarán disponibles como si + se hubieran definido dentro de la función que realiza la llamada. + + + + Ejemplo de una variable de ámbito local + ]]> - - + + - Este script no producirá salida, ya que la sentencia echo utiliza una - versión local de la variable $a, a la que no se ha - asignado ningún valor en su ámbito. Puede que usted note que hay una - pequeña diferencia con el lenguaje C, en el que las variables globales - están disponibles automáticamente dentro de la función a menos que sean - expresamente sobreescritas por una definición local. Esto puede causar - algunos problemas, ya que la gente puede cambiar variables globales - inadvertidamente. En PHP, las variables globales deben ser declaradas - globales dentro de la función si van a ser utilizadas dentro de dicha - función. + El ejemplo anterior producirá un E_WARNING por una + variable no definida (o un E_NOTICE antes de PHP 8.0.0). + Esto se debe a la expresión echo hace referencia a una versión local de + la variable $a, a la cual no se le ha asignado un valor + dentro de su ámbito. + Puede que usted note que hay una pequeña diferencia con el lenguaje C, + en el que las variables globales están disponibles automáticamente dentro + de la función a menos que sean expresamente sobreescritas por una + definición local. Esto puede causar algunos problemas, ya que la gente + podría cambiar variables globales sin darse cuenta. + En PHP, las variables globales deben ser declaradas globales dentro de la + función si van a ser utilizadas dentro de dicha función. La palabra clave <literal>global</literal> - En primer lugar, un ejemplo de uso de global: + La palabra clave global se usa para vincular una + variable desde el ámbito global a un ámbito local. La palabra clave + puede ser usada con una lista de variables o con una sola variable. + Una variable local será creada haciendo referendia a una variable global + con el mismo nombre. Si no existe la variable global, la variable será + creada en el ámbito global y asignado el valor &null;. @@ -310,21 +350,27 @@ echo $b; ?> ]]> + &example.outputs; + + + - El script anterior producirá la salida 3. Al declarar + Al declarar las variables $a y $b globales dentro de la función, todas las referencias a tales variables se referirán a la - versión global. No hay límite al número de variables globales que se + versión global. No hay límite al número de variables globales que se pueden manipular dentro de una función. Un segundo método para acceder a las variables desde un ámbito global es - usando el array $GLOBALS. El ejemplo anterior se - puede reescribir así: + usando el array especial definido por PHP $GLOBALS. + El ejemplo anterior se puede reescribir así: @@ -363,17 +409,8 @@ echo $b; @@ -450,12 +487,9 @@ function test() Las variables estáticas también proporcionan una forma de manejar - funciones recursivas. Una función recursiva es la que se llama a sí - misma. Se debe tener cuidado al escribir una función recursiva, ya que - puede ocurrir que se llame a sí misma indefinidamente. Hay que - asegurarse de implementar una forma adecuada de terminar la recursión. - La siguiente función cuenta recursivamente hasta 10, usando la variable - estática $count para saber cuándo parar: + funciones recursivas. La siguiente función cuenta recursivamente + hasta 10, usando la variable estática $count + para saber cuándo parar: @@ -480,43 +514,103 @@ function test() - - - Las variables estáticas pueden ser declaradas como se ha visto en los ejemplos anteriores. - Desde PHP 5.6 se pueden asignar valores a estas variables que sean el resultado de - expresiones, aunque no se pueden usar funciones aquí, lo cual causaría un eror de análisis. - - - - Declaración de variables estáticas - + + Antes de PHP 8.3.0, las variables estáticas solo podían ser inicializadas + usando expresiones constantes. A partir de PHP 8.3.0, expresiones dinámicas + (por ejemplo, llamadas a funciones) también están permitidas: + + + + Declarando variables estáticas + ]]> - - - - - - - Las declaraciones estáticas son resueltas en tiempo de compilación. - - + + + + + + Las variables estáticas dentro de funiones anónimas también persisten + solo dentro de esa instancia específica de la función. Si la función + anónima es recreada en cada llamada, la variable estática será + reinicializada. + + + Variables estácias en funciones anónimas + + +]]> + + + + + A partir de PHP 8.1.0, cuando un método que usa variables estáticas es + heredado (pero no sobrescrito), el método heredado compartirá ahora las + variables estáticas con el método padre. Esto significa que las variables + estáticas en los métodos ahora se comportan de la misma manera que las + propiedades estáticas. + + + + A partir de PHP 8.3.0, las variables estáticas pueden ser inicializadas con + expresiones arbitrarias. Esto significa que las llamadas a métodos, por + ejemplo, pueden ser usadas para inicializar variables estáticas. + + + + Uso de variables estáticas en métodos heredados + + +]]> + + + Referencias con variables <literal>global</literal> y <literal>static</literal> - El motor Zend 1, utilizado por PHP 4, implementa los modificadores + PHP implementa los modificadores static y global para variables en términos de referencias. @@ -532,12 +626,14 @@ function foo(){ - NULL - object(stdClass)(0) { - } + @@ -572,10 +670,15 @@ function &obtener_instancia_ref() { echo 'Objeto estático: '; var_dump($obj); if (!isset($obj)) { + $new = new stdClass; // Asignar una referencia a la variable estática - $obj = &new stdclass; + $obj = &$new; + } + if (!isset($obj->property)) { + $obj->property = 1; + } else { + $obj->property++; } - $obj->property++; return $obj; } @@ -585,10 +688,15 @@ function &obtener_instancia_no_ref() { echo 'Objeto estático: '; var_dump($obj); if (!isset($obj)) { + $new = new stdClass; // Asignar el objeto a la variable estática - $obj = new stdclass; + $obj = $new; + } + if (!isset($obj->property)) { + $obj->property = 1; + } else { + $obj->property++; } - $obj->property++; return $obj; } @@ -603,14 +711,16 @@ $aun_obj2 = obtener_instancia_no_ref(); &example.outputs; - Objeto estático: NULL - Objeto estático: NULL + - int(1) - } +Objeto estático: NULL +Objeto estático: object(stdClass)#3 (1) { + ["property"]=> + int(1) +} +]]> @@ -713,16 +823,6 @@ echo "$a $hola"; si $bar es un acceso a un array. - - - Además, derreferenciar una propiedad variable que es un array tiene diferente - semántica entre PHP 5 y PHP 7. La - guías de migración de PHP 7.0 - incluye más detalles sobre los tipos de expresiones que han cambiado, - y cómo colocar llaves para evitar ambigüedades. - - - También se pueden usar llaves para delimitar de forma clara el nombre de la propiedad. Son muy útila al acceder a valores dentro una propiedad que @@ -755,18 +855,19 @@ $end = 'ar'; echo $foo->{$start . $end} . "\n"; $arr = 'arr'; -echo $foo->$arr[1] . "\n"; echo $foo->{$arr[1]} . "\n"; +echo $foo->{$arr}[1] . "\n"; ?> ]]> &example.outputs; - Soy bar. - Soy bar. - Soy bar. - Soy r. +Soy bar. +Soy bar. +Soy bar. +Soy r. +Soy B. @@ -811,8 +912,8 @@ echo $foo->{$arr[1]} . "\n"; - A partir de PHP 5.4.0, solamente existen dos maneras de acceder a datos desde - formularios HTML. Los métodos disponibles actualmente se enumeran a continuación: + Solamente existen dos maneras de acceder a datos desde formularios HTML. + Los métodos disponibles actualmente se enumeran a continuación: @@ -829,32 +930,6 @@ echo $_REQUEST['username']; - - Habían otras formas de acceder a la entrada del usuario en versiones antiguas de PHP. Están - enumeradas abajo. Véase el historial de cambios al final para más detalles. - - Old methods of accessing user input - - -]]> - - - - Usar un formulario con GET es similar excepto en el uso de variables predefinidas, que en este caso serán del tipo GET. GET también se usa @@ -909,6 +984,15 @@ if ($_POST) { + + + Si una variable externa comienza con una sintaxis de array válida, + Los caracteres finales se ignoran en silencio. Por ejemplo, + <input name="foo[bar]baz"> + se convierte en $_REQUEST['foo']['bar']. + + + Nombres de variables tipo IMAGE SUBMIT @@ -956,6 +1040,14 @@ if ($_POST) { detalles y ejemplos. + + + A partir de PHP 7.2.34, 7.3.23 y 7.4.11, respectivamente, los + nombres de las cookies entrantes ya no son con url-decoded + por razones de seguridad. + + + Si se quieren asignar múltiples valores a una sola cookie, basta con asignarlo como un array. Por ejemplo: