La sintaxis y la semántica de PHP , un lenguaje de programación , forman un conjunto de reglas que definen cómo se puede escribir e interpretar un programa PHP.
Históricamente, el desarrollo de PHP ha sido algo desordenado. Para contrarrestar esto, PHP Framework Interop Group (FIG) ha creado los documentos PHP Standards Recommendation (PSR) que han ayudado a lograr una mayor estandarización del lenguaje desde 2009. [1] Los estándares de codificación modernos están contenidos en PSR-1 (Codificación básica Estándar) [2] y PSR-2 (Guía de estilo de codificación). [3]
Algunas palabras clave representan cosas que parecen funciones, otras parecen constantes, pero en realidad son construcciones del lenguaje. Está prohibido utilizar palabras clave como constantes, nombres de clases, funciones o métodos. Está permitido usarlos como nombres de variables, pero puede resultar confuso. [4]
__halt_compiler()
abstract
and
array()
as
break
callable
(a partir de PHP 5.4)case
catch
class
clone
const
continue
declare
default
die()
do
echo
else
elseif
empty()
enddeclare
endfor
endforeach
endif
endswitch
endwhile
eval()
exit()
extends
final
finally
(a partir de PHP 5.5)fn
(a partir de PHP 7.4)for
foreach
function
global
goto
(a partir de PHP 5.3)if
implements
include
include_once
instanceof
insteadof
(a partir de PHP 5.4)interface
isset()
list()
match
(a partir de PHP 8.0)namespace
(a partir de PHP 5.3)new
or
print
private
protected
public
require
require_once
return
static
switch
throw
trait
(a partir de PHP 5.4)try
unset()
use
var
while
xor
yield
(a partir de PHP 5.5)yield from
(a partir de PHP 7.0)PHP generalmente sigue la sintaxis de C , con excepciones y mejoras para su uso principal en el desarrollo web , que hace un uso intensivo de la manipulación de cadenas . Las variables PHP deben tener el prefijo " $
". Esto permite a PHP realizar interpolación de cadenas en cadenas entre comillas dobles , donde se admite la barra invertida como carácter de escape . No se realiza ningún escape ni interpolación en cadenas delimitadas por comillas simples . PHP también admite una función sprintf similar a C. El código se puede modularizar en funciones definidas con palabra clave function
. PHP admite un estilo de codificación opcional orientado a objetos , con clases indicadas por la class
palabra clave. Las funciones definidas dentro de las clases a veces se denominan métodos . Las estructuras de control incluyen: if
, while
, do/while
, for
, foreach
y switch
. Las declaraciones terminan con un punto y coma, no con finales de línea. [5]
El procesador PHP sólo analiza el código dentro de sus delimitadores . Todo lo que esté fuera de sus delimitadores se envía directamente a la salida y PHP no lo analiza. Los únicos delimitadores de apertura/cierre permitidos por PSR-1 [6] son " <?php
" y " ?>
" o y .<?=
?>
El propósito de las etiquetas delimitadoras es separar el código PHP de los datos que no son PHP (principalmente HTML). Aunque es poco común en la práctica, PHP ejecutará código incrustado en cualquier archivo pasado a su intérprete, incluidos archivos binarios como archivos PDF o JPEG, o en archivos de registro del servidor. [7] [8] Todo lo que esté fuera de los delimitadores es ignorado por el analizador PHP y se pasa como salida. [9]
Estos delimitadores recomendados crean XHTML y otros documentos XML con el formato correcto . [10] Esto puede ser útil si los documentos del código fuente alguna vez necesitan procesarse de otras maneras durante la vida útil del software.
Si la validación XML adecuada no es un problema y un archivo contiene solo código PHP, es preferible omitir la ?>
etiqueta de cierre PHP () al final del archivo. [11]
Se pueden utilizar otros delimitadores en algunos servidores, aunque la mayoría ya no son compatibles. [12] Algunos ejemplos son:
<script language="php">
" y " </script>
" (eliminados en PHP7)<?
) (configuradas con la short_open_tag
configuración ini)<?
etiqueta es <?=
, que refleja automáticamente la siguiente declaración. Antes de PHP 5.4.0, esto también se controlaba con short_open_tag
, pero siempre está disponible en versiones posteriores.<%
( o <%=
) (eliminadas en PHP7)Las variables tienen como prefijo un símbolo de dólar y no es necesario especificar un tipo de antemano. A diferencia de los nombres de funciones y clases, los nombres de variables distinguen entre mayúsculas y minúsculas. Tanto las cadenas entre comillas dobles ( ""
) como las heredoc permiten incrustar el valor de una variable en la cadena. [13] Al igual que en C, las variables se pueden convertir a un tipo específico anteponiendo el tipo entre paréntesis. PHP trata las nuevas líneas como espacios en blanco , a la manera de un lenguaje de formato libre . El operador de concatenación es .
(punto). Se accede a los elementos de la matriz y se configuran entre corchetes tanto en matrices asociativas como en matrices indexadas. Las llaves se pueden utilizar para acceder a elementos de una matriz, pero no para asignarlos.
PHP tiene tres tipos de sintaxis de comentarios : /* */
que sirven como comentarios en bloque y que //
también #
se utilizan para comentarios en línea. [14] Muchos ejemplos utilizan la print
función en lugar de la echo
función. Ambas funciones son casi idénticas; la principal diferencia es que print
es más lento echo
porque el primero devolverá un estado que indica si tuvo éxito o no además del texto para generar, mientras que el segundo no devuelve un estado y solo devuelve el texto para generar. [15]
El ejemplo habitual de código " Hola mundo " para PHP es: [16]
<?php echo "¡Hola mundo! \n " ; ?>
El ejemplo anterior genera lo siguiente:
¡Hola Mundo!
En lugar de usar <?php
y la echo
declaración, un "atajo" opcional es el uso de en lugar de cual hace eco implícitamente de los datos. Por ejemplo:<?=
<?php
<!DOCTYPE html><html> < cabeza > < título > PHP "¡Hola mundo!" programa </ título > </cabeza> < cuerpo > < p > <? = "¡Hola mundo!" ? > </p> </cuerpo></html>
El ejemplo anterior también ilustra que el texto que no esté contenido en las etiquetas PHP adjuntas se generará directamente.
PHP admite: operadores aritméticos , operadores de asignación , operadores bit a bit , operadores de comparación , operadores de control de errores, operadores de ejecución, operadores de incremento/decremento , operadores lógicos , operadores de cadena , operadores de matriz, operadores de asignación condicional . [17]
La sintaxis de una declaración PHP if... else es la siguiente:
if ( condición ) { // declaraciones; } elseif ( condición2 ) { // declaraciones; } else { // declaraciones; }
Para declaraciones individuales, se pueden omitir los corchetes y, opcionalmente, condensarlos en una sola línea:
si ( condición ) hacer algo (); elseif ( condición2 ) hacer algo más (); else doyetatercera cosa ();
$abs = $valor >= 0 ? $valor : - $valor ;/* Equivalente a */if ( $valor >= 0 ) { $abs = $valor ; } más { $abs = - $valor ; }
Desde PHP 5.3 soporta el operador Elvis ( ?:
) en el que es posible omitir la parte media del operador ternario.
$c = $a ?: $b ; /* Equivalente a */$c = $a ? $a : $b ;
Desde la versión 7.0, PHP también admite el operador coalescente nulo ( ??
).
$a = $b ?? $c ;/* Equivalente a */$a = isset ( $b ) ? $b : $c ;
Desde la versión 7.4, PHP también admite el operador coalescente nulo con la ??=
sintaxis.
$a ??= $b ;/* Equivalente a */$a = $a ?? $b ;
Desde la versión 8.0 PHP también soporta el operador de navegación segura ( ?->
).
$variable = $objeto ?-> método ();/* Equivalente a */$variable = $objeto !== nulo ? $objeto -> método () : nulo ;
Un ejemplo de la sintaxis de una declaración de cambio de PHP es el siguiente:
switch ( expr ) { caso 0 : // declaraciones; romper ; caso 1 : // declaraciones; romper ; caso 2 : // declaraciones; romper ; predeterminado : // declaraciones; }
Tenga en cuenta que, a diferencia de C , los valores en la declaración case pueden ser de cualquier tipo, no solo números enteros. [18]
PHP 8 introduce la match
expresión. [19] La expresión de coincidencia es conceptualmente similar a una switch
declaración y es más compacta para algunos casos de uso. [20]switch
las declaraciones son tradicionalmente preferidas para comparaciones simples basadas en valores; match
las declaraciones proporcionan más flexibilidad y legibilidad, particularmente cuando se usan en condiciones o patrones complejos [21]
coincidencia de eco ( 1 ) { 0 => 'Foo' , 1 => 'Bar' , 2 => 'Baz' , }; // barra
La sintaxis PHP de un bucle for es la siguiente:
for ( inicialización ; condición ; ocurrencia tardía ) { // declaraciones; }
La sintaxis para un bucle while de PHP es la siguiente:
mientras ( condición ) { // declaraciones; }
La sintaxis para un bucle PHP do while es la siguiente:
hacer { // declaraciones; } mientras ( condición );
La sintaxis de PHP para cada bucle es la siguiente:
foreach ( $establecido como $valor ) { // declaraciones; }
PHP ofrece una sintaxis alternativa que utiliza dos puntos en lugar de la sintaxis estándar de llaves (de " {...}
"). Esta sintaxis afecta a las siguientes estructuras de control: if
, while
, for
, foreach
y switch
. La sintaxis varía sólo ligeramente de la sintaxis de llaves. En cada caso, la llave de apertura ( {
) se reemplaza con dos puntos ( :
) y la llave de cierre se reemplaza con endif;
, endwhile;
, endfor;
, endforeach;
o endswitch;
, respectivamente. [22] No se admite la mezcla de estilos de sintaxis dentro del mismo bloque de control. Un ejemplo de sintaxis para una declaración if
/ elseif
es el siguiente:
if ( condición ) : // codifica aquí elseif ( condición ) : // codifica aquí else : // codifica aquí endif ;
Este estilo a veces se denomina sintaxis de plantilla, ya que a menudo resulta más fácil de leer cuando se combinan PHP y HTML o JavaScript para salida condicional:
< html > <?php if ( $day == 'Jueves' ) : ?> < div > ¡Mañana es viernes! </ div > <?php elseif ( $día == 'Viernes' ) : ?> < div > TGIF </ div > <?php else : ?> < div > ugh </ div > <?php endif ; ? > </html>
El método de manejo de excepciones en tiempo de ejecución en PHP se hereda de C++. [23]
función inv ( $x ) { if ( $x == 0 ) { lanzar nueva excepción ( "División por cero" ); } devolver 1 / $x ; }prueba { echo inv ( 2 ); // imprime 0,5 echo inv ( 0 ); // lanza una excepción echo inv ( 5 ); // no se ejecutará } catch ( Excepción $e ) { echo $e -> getMessage (); // imprime División por cero }// Continuar la ejecución echo "Hola" ; // imprime Hola
PHP admite cuatro tipos escalares: bool
, int
, float
, string
. [24]
PHP tiene un tipo booleano nativo , llamado " bool
", similar a los tipos booleanos nativos en Java y C++ . Usando las reglas de conversión de tipos booleanos, los valores distintos de cero se interpretan como true
y el cero como false
, como en Perl . Ambas son constantes true
y false
no distinguen entre mayúsculas y minúsculas. [25]
PHP almacena números enteros en un rango que depende de la plataforma. Este rango suele ser el de enteros con signo de 32 o 64 bits. [26] Las variables enteras se pueden asignar usando notaciones decimales (positivas y negativas), octales , hexadecimales y binarias .
$a = 1234 ; // numero decimal $b = 0321 ; // número octal (equivalente a 209 decimal) $c = 0x1B ; // número hexadecimal (equivalente a 27 decimal) $d = 0 b11 ; // número binario (equivalente a 3 decimal) $e = 1 _234_567 ; // número decimal (a partir de PHP 7.4.0)
Los números reales también se almacenan en un rango específico de la plataforma. Se pueden especificar utilizando notación de punto flotante o dos formas de notación científica . [27]
$a = 1,234 ; $b = 1.2e3 ; // 1200 $c = 7E-5 ; // 0.00007 $d = 1 _234 . 567 ; // a partir de PHP 7.4.0
Admite PHP strings
, que se puede usar con comillas simples, comillas dobles, sintaxis nowdoc o heredoc . [28]
Las cadenas entre comillas dobles admiten la interpolación de variables:
$edad = '23' ;echo "John tiene $edad años" ; // Juan tiene 23 años
Sintaxis de llaves: [29]
$f = "sqrt" ; $x = 25 ;echo "a $xc \n " ; // Advertencia: Variable no definida $xc echo "a { $x } c \n " ; // imprime a25c echo "a ${ x } c \n " ; // también imprime a25cecho " $f ( $x ) es { $f ( $x ) } \n " ; // imprime sqrt(25) es 5
PHP admite dos tipos especiales: null
, resource
. El null
tipo de datos representa una variable que no tiene valor. El único valor en el null
tipo de datos es NULL . La constante NULL no distingue entre mayúsculas y minúsculas. [30] Las variables del resource
tipo " " representan referencias a recursos de fuentes externas. Por lo general, estos se crean mediante funciones de una extensión particular y solo pueden ser procesados por funciones de la misma extensión. Los ejemplos incluyen recursos de archivos, imágenes y bases de datos. [24]
PHP admite cuatro tipos compuestos: array
, object
, callable
, iterable
.
Las matrices pueden contener elementos mixtos de cualquier tipo, incluidos recursos y objetos. [31] Las matrices multidimensionales se crean asignando matrices como elementos de matriz. PHP no tiene un tipo de matriz verdadero. Las matrices PHP son nativamente dispersas y asociativas . Las matrices indexadas son simplemente hashes que utilizan números enteros como claves.
Matriz indexada:
$temporada = [ "Otoño" , "Invierno" , "Primavera" , "Verano" ]; echo $temporada [ 2 ]; // Primavera
Matriz asociativa:
$salario = [ "Alex" => 34000 , "Bill" => 43000 , "Jim" => 28000 ]; echo $salario [ "Factura" ]; // 43000
Matriz multidimensional:
$mark = [ "Alex" => [ "biología" => 73 , "historia" => 85 ], "Jim" => [ "biología" => 86 , "historia" => 92 ] ];echo $marca [ "Jim" ][ "historia" ]; // 92
El object
tipo de datos es una combinación de variables, funciones y estructuras de datos en el paradigma de programación orientada a objetos .
clase Persona { //... }$persona = nueva Persona ();
Desde la versión 5.3 PHP tiene funciones de primera clase que pueden usarse, por ejemplo, como argumento para otra función.
corredor de función ( $función invocable , mixta ... $args ) { return $función ( ... $args ); } $f = fn ( $x , $y ) => $x ** $y ;función suma ( int | float ... $args ) { return array_sum ( $args ); } corredor de eco ( fn ( $x ) => $x ** 2 , 2 ); // imprime 4 corredores de eco ( $f , 2 , 3 ); // imprime 8 echo runner ( 'suma' , 1 , 2 , 3 , 4 ); // imprime 10
Iterable
El tipo indica que la variable se puede utilizar con foreach
el bucle. [32] Puede ser cualquier objeto array
o generator
que implemente la interfaz interna especial Traversable
[33] .
función imprimirCuadrados ( iterable $datos ) { foreach ( $datos como $valor ) { echo ( $valor ** 2 ) . " " ; } eco " \n " ; }// matriz $matriz = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ];// generador $generador = función () : Generador { para ( $i = 1 ; $i <= 10 ; $i ++ ) { rendimiento $i ; } };// objeto $arrayIterator = nuevo ArrayIterator ([ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ]);imprimirCuadrados ( $matriz ); // 1 4 9 16 25 36 49 64 81 100 imprimirCuadrados ( $generador ()); // 1 4 9 16 25 36 49 64 81 100 imprimirCuadrados ( $arrayIterator ); // 1 4 9 16 25 36 49 64 81 100
Los tipos de unión se introdujeron en PHP 8.0 [34]
función foo ( cadena | int $foo ) : cadena | En t {}
PHP tiene cientos de funciones base y miles más de extensiones. Antes de la versión 5.3.0 de PHP, las funciones no eran funciones de primera clase y solo se podía hacer referencia a ellas por su nombre, mientras que PHP 5.3.0 introduce cierres. [35] Las funciones definidas por el usuario se pueden crear en cualquier momento y sin necesidad de crear prototipos. [35] Las funciones se pueden definir dentro de bloques de código, lo que permite una decisión en tiempo de ejecución sobre si se debe definir o no una función. No existe el concepto de funciones locales. Las llamadas a funciones deben utilizar paréntesis con la excepción de las funciones constructoras de clases sin argumentos llamadas con el new
operador PHP, donde los paréntesis son opcionales.
Una definición de función de ejemplo es la siguiente:
función hola ( $objetivo = 'Mundo' ) { echo "¡Hola $objetivo ! \n " ; }Hola (); // genera "¡Hola mundo!" hola ( 'Wikipedia' ); // genera "¡Hola Wikipedia!"
Las llamadas a funciones se pueden realizar a través de variables, donde el valor de una variable contiene el nombre de la función a llamar. Esto se ilustra en el siguiente ejemplo:
función hola () { return 'Hola' ; }función mundo () { return "¡Mundo!" ; }$función1 = 'hola' ; $función2 = 'mundo' ;echo " { $función1 () } { $función2 () } " ;
Se puede asignar un valor predeterminado para los parámetros en la definición de la función, pero antes de PHP 8.0 no se admitían parámetros con nombre ni la omisión de parámetros. [36] Algunos desarrolladores principales de PHP han expresado públicamente su decepción con esta decisión. [37] Otros han sugerido soluciones para esta limitación. [38]
Los argumentos con nombre se introdujeron en PHP 8.0
función potencia ( $base , $exp ) { return $base ** $exp ; }// Usando argumentos posicionales: echo power ( 2 , 3 ); // imprime 8// Usando argumentos con nombre: echo power ( base : 2 , exp : 3 ); // imprime 8 potencias de eco ( exp : 3 , base : 2 ); // imprime 8
La especificación de los tipos de parámetros de función y valores de retorno de función se admite desde PHP 7.0. [39]
Declaración de tipo de devolución:
función suma ( $a , $b ) : flotador { retorno $a + $b ; }var_dump ( suma ( 1 , 2 )); // imprime flotador(3)
Escritura de parámetros:
función suma ( int $a , int $b ) { return $a + $b ; }var_dump ( suma ( 1 , 2 )); // imprime int(3) var_dump ( suma ( 1.6 , 2.3 )); // imprime int(3)
Sin escritura estricta habilitada:
$f1 = fn ( $a , $b ) : int => $a + $b ; $f2 = fn ( int $a , int $b ) => $a + $b ;var_dump ( $f1 ( 1.3 , 2.6 )); // imprime int(3) var_dump ( $f1 ( 1 , '2' )); // imprime int(3) var_dump ( $f2 ( 1.3 , 2.6 )); // imprime int(3) var_dump ( $f2 ( 1 , '2' )); // imprime int(3)
Con escritura estricta habilitada:
declarar ( tipos_estrictos = 1 ); $f1 = fn ( $a , $b ) : int => $a + $b ; $f2 = fn ( int $a , int $b ) => $a + $b ;var_dump ( $f1 ( 1.3 , 2.6 )); // Error fatal: el valor de retorno debe ser de tipo int, float devolvió var_dump ( $f1 ( 1 , '2' )); // imprime int(3) var_dump ( $f2 ( 1.3 , 2.6 )); // Error fatal: el argumento #1 ($a) debe ser de tipo int, float dado var_dump ( $f2 ( 1 , '2' )); // Error fatal: el argumento n.° 2 ($b) debe ser de tipo int, se proporciona la cadena
PHP admite funciones anónimas verdaderas a partir de la versión 5.3. [35] En versiones anteriores, PHP solo admitía funciones casi anónimas a través de la create_function()
función.
$x = 3 ; $func = función ( $z ) { return $z * 2 ; }; eco $func ( $x ); // imprime 6
Desde la versión 7.4, PHP también admite la sintaxis de funciones de flecha ( =>
). [40]
$x = 3 ; $func = fn ( $z ) => $z * 2 ; eco $func ( $x ); // imprime 6
Creando cierres
$agregar = fn ( $x ) => fn ( $y ) => $y + $x ;/* Equivalente a */$agregar = función ( $x ) { función de retorno ( $y ) uso ( $x ) { retorno $y + $x ; }; };
usando
$f = $añadir ( 5 );eco $f ( 3 ); // imprime 8 echo $add ( 2 )( 4 ); // imprime 6
A PHP no le importan los tipos de argumentos variables a menos que el argumento esté escrito.
función suma ( ... $nums ) : int { return array_sum ( $nums ); } suma de eco ( 1 , 2 , 3 ); // 6
Y argumentos variados escritos:
función suma ( int ... $nums ) : int { return array_sum ( $nums ); } suma de eco ( 1 , 'a' , 3 ); // TypeError: el argumento 2 pasado a sum() debe ser del tipo int (desde PHP 7.3)
Usando generadores, podemos escribir código que use foreach para iterar sobre un conjunto de datos sin tener que crear una matriz en la memoria, lo que puede resultar en una sobrecarga de memoria o un tiempo de procesamiento significativo para la generación.
La funcionalidad básica de programación orientada a objetos se agregó en PHP 3. [41] El manejo de objetos se reescribió completamente para PHP 5, ampliando el conjunto de funciones y mejorando el rendimiento. [42] En versiones anteriores de PHP, los objetos se manejaban como tipos primitivos . [42] El inconveniente de este método era que todo el objeto se copiaba cuando se asignaba o pasaba una variable como parámetro a un método. En el nuevo enfoque, se hace referencia a los objetos por identificador y no por valor. PHP 5 introdujo variables y métodos miembros privados y protegidos, junto con clases abstractas y clases finales , así como métodos abstractos y métodos finales . También introdujo una forma estándar de declarar constructores y destructores , similar a la de otros lenguajes orientados a objetos como C++ , y un modelo estándar de manejo de excepciones . Además, PHP 5 agregó interfaces y permite implementar múltiples interfaces. Existen interfaces especiales que permiten que los objetos interactúen con el sistema de ejecución. Los objetos que implementan ArrayAccess se pueden usar con sintaxis de matriz y los objetos que implementan Iterator o IteratorAggregate se pueden usar con la construcción del lenguaje foreach . El método estático y las funciones de variable de clase en Zend Engine 2 no funcionan como algunos esperarían. No hay ninguna función de tabla virtual en el motor, por lo que las variables estáticas se vinculan con un nombre en lugar de una referencia en el momento de la compilación. [43]
Este ejemplo muestra cómo definir una clase Foo
que hereda de la clase Bar
. El método myStaticMethod
es un método estático público que se puede llamar con Foo::myStaticMethod();
.
clase Foo extiende Bar { function __construct () { $doo = "wah dee dee" ; } función estática pública myStaticMethod () { $dee = "dee dee dum" ; } }
Si el desarrollador crea una copia de un objeto usando la palabra reservada clonar , el motor Zend verificará si __clone()
se ha definido un método o no. De lo contrario, llamará a un valor predeterminado __clone()
que copiará las propiedades del objeto. Si se define un __clone()
método, será responsable de establecer las propiedades necesarias en el objeto creado. Para mayor comodidad, el motor proporcionará una función que importa las propiedades del objeto fuente, de modo que el programador pueda comenzar con una réplica por valor del objeto fuente y solo anular las propiedades que deben cambiarse. [44]
Este ejemplo utiliza un rasgo para mejorar otras clases:
// El rasgo de plantilla TSingleton { private static $_instance = null ; función privada __construct () {} // Debe tener un constructor privado predeterminado y tener cuidado de no abrirlo en la clase función estática pública getInstance () { if ( null === self :: $_instance ) { self :: $_instance = new self (); } devolver uno mismo :: $_instancia ; } }clase FrontController { use TSingleton ; }// También se puede utilizar en clases ya extendidas class WebSite extends SomeClass { use TSingleton ; }
Esto permite simular aspectos de la herencia múltiple:
rasgo TBounding { public $x , $y , $ancho , $alto ; }rasgo TMoveable { función pública moverA ( $x , $y ) { //… } } rasgo TResizeable { cambio de tamaño de función pública ( $ nuevo ancho , $ nuevo alto ) { //… } } clase Rectángulo { use TBounding , TMoveable , TResizeable ; función pública fillColor ( $color ) { //… } }