PHP
# Sintaxis Basica
Para reconocer bloques de codigo PHP utiliza la sintaxis <?php // codigo ?>
# Imprimir a pantalla
Existen dos funciones que sirven para imprimir por pantalla:
| |
La diferencia entre estas es que print nos permite imprimir texto unicamente y print nos permite imprimir valores de las variables
Ademas print retorna un valor 1 o “True”
echo puede ser utilizadas sin parentesis, esto permite concatenar multiples valores utilizando una coma
| |
Y variables utilizando un punto
| |
# Imprimir Variables
Para imprimir variables debemos utilizar un string de texto entre comillas dobles, debido a que estas nos permiten imprimir por pantalla el valor de la variable
| |
# Variables
Las variables inician con simbolos $, estas deben iniciar con letras, o guion bajo y no puede contener caracteres especiales.
# Por valor
Ademas, las variables son asignadas por valor, con lo que si hacemos esto:
| |
Al final obtendremos 1 como respuesta.
# Por referencia
Por otro lado, si lo que queremos realmente es la referencia que tiene la variable podemos utilizar el operador &
| |
# Constantes
Existen dos formas principales de definir constantes
- utilizando la keyword const
- utilizando la funcion define()
Estas siguen las mismas reglas de las variables y deben encontrarse escritas en mayusculas. Para referirse a ellas dentro de funciones o bloques de codigo no es necesario utilizar ningun simbolo, estas son escritas como texto plano
| |
# const
Este tipo de constantes se definen en tiempo de compilacion y por tanto solo pueden ser definadas al inicio del bloque de codigo de PHP.
| |
# define()
Este tipo de constantes pueden ser definidas en cualquier punto del codigo de PHP debido a que son definidas en tiempo de ejecucion.
# Variable de Variable
Es un tipo de variable que adquiere el nombre de forma dinamica proveniente del valor de otra variable. Se define utilizando doble simbolo de $$.
| |
# Tipos de Datos
Hay diez tipos de datos basicos en PHP:
- bool
- int
- float
- string
- array
- object
- callable
- iterable
- resource
- null
# var_dump()
Es una funcion muy util que sirve para ver el tipo de dato y el valor que tiene una variable en tiempo de ejecucion
| |
# type juggling / type coercion
Es un mecanismo introducido en PHP para que las funciones ejecuten una conversion al inicio del llamado, y levanten un error en caso de que se les envie un tipo de dato que no tiene casting al tipo de dato indicado.
| |
En caso de querer que no se acepte ningun valor que no sea int (Es decir, que no se le realice ningun tipo de casting) se debe activar el modo estricto
# Strict mode / Strict types
Para activar el modo estricto se debe declarar la siguiente configuracion al inicio del script:
| |
Con esta linea de codigo se activara el modo estricto y se hara que se respete el type juggling sin hacer ningun tipo de casting
# Casting
El casting es bastante similar a Java utilizando la sintaxis de los parentesis
| |
# Falsy Values
En PHP tambien se cuenta con una serie de Falsy values que sirven para hacer las condicionales un poco mas faciles de aplicar si los entiendes correctamente
| |
# Array
Es una estructura de datos basica, en PHP, parece estar soportada por una lista / mapa.
| |
Como todos los lenguajes de programacion, los arrays tienen un indice iniciando por cero. Si accedes a un elemento que no existe tendras el error undefined y obtendras null como resultado.
# Insertar
Para insertar un nuevo valor basta con colocar la sintaxis de los squarebrackets sin un key, esto es debido a que, si no se especifica un key asociativo, el array le dara el siguiente que se tiene disponible en la secuencia numerica.
| |
Otra forma es utilizando la funcion array_push()
| |
# Keys personalizadas
Como ya sabemos, los arrays en PHP asignan keys numericas basadas en indice 0 en caso de no asignar una nosotros manualmente.
Sin embargo, PHP ofrece la facilidad de crear un array asociativo unicamente cambiando la sintaxis en como se define un poco:
| |
# Remover
Para remover un elemento tenemos dos metodos bastante utiles array_pop y array_shift.
| |
La diferencia esque array_shift tiene que re-indexar todos los indices del array, por tanto, si se tienen numeros arbitrarios a la secuencia original estos seran reasignados y seguiran la secuencia original iniciando en cero.
Como extra, tenemos una funcion que sirve para liberar memoria llamada unset() a esta funcion podemos mandarle un array con una llave y removera dicho valor del array al liberar su memoria
| |
Utilizando esta funcion el array no es reindexado, con lo que las llaves se preservan y la secuencia tambien.
# Operadores
# Aritmetica
PHP cuenta con multiples operadores aritmeticos, los principales:
- +. Suma
- -. Resta
- *. Multiplicacion
- /. Division
- **. Potencia
Un detalle importante a tener en cuenta esque el operador modulo (%) castea todo a integers, por tanto, si se trata de buscar el modulo de dos numeros flotantes se debe utilizar la funcion fmod(a, b)
| |
# Strings
Los Strings tienen un unico operador que sirve para concatenar, tambien lo tienen en forma de apender al final de string:
| |
# Comparacion
Al igual que en JavaScript existen dos operadores para hacer comparacion directa:
- ==
- === El primero hace conversion de tipos y tiene comportamiento no deseado, usualmente, se recomienda utilizar el tercero.
| |
Existe un operador bastante extraño llamado spaceship operator que retorna un valor -1, 0 o 1 en dependiendo de si un valor es mayor, menor o igual que otro
| |
Null Coalescing Es otro operador que nos sirve para dar un valor por defecto en caso de encontrarnos con un null.
| |
# Operadores Bitwise
Son operadores que sirven para realizar operaciones a nivel de bit, binarios. Sirven para hacer aritmetica con numeros a nivel de los bits.
# Operadores Array
Existen operadores que sirven para manipular arrays.
- +. Union. Apende los elementos del segundo array a los del primero en caso de que sus keys no se encuentren existentes en el
- ==. Compara valores y llaves entre dos arrays, unicamente retornara true si todos los valores coinciden
- ===. Compara los valores y llaves entre dos arrays pero sin realizar conversion de tipos, es decir, es mas estricto
# Expresion Match
Bastante similar al Switch expression, fue introducida en PHP 8-
| |
Das pares de llave valor donde la llave es el resultadode la expresion.
La diferencia esque la expresion match retorna el valor con el que la expresion que esta siendo evaluada concuerda, hasta llegar al caso default.
La segunda diferencia esque en esta expresion match no necesitas utilizar break, en cuanto se encuentre una coincidencia retornara el valor.
La tercer diferencia esque la expresion Match hace comparasion estricta (===) y switch la debil (==)/
Finalmente, la expresion match debe proveer todos los casos posibles incluido un caso default para que no se genere ningun error.
# Declare statement
Es un statement que sirve para definir unas cuantas configuraciones en el script de PHP. Todas estas declarativas solo se aplican al script actual, en caso de llevarse o exportar funciones a otro script estas no se aplicaran.
# Ticks
Los ticks son un evento que ocurre cuando el parser esta leyendo el codigo linea por linea. Este, en forma de evento, nos permite ejecutar una funcion cada X ticks de forma personalizada.
| |
# Encoding
Ayuda a especificar el Encoding del script. Es decir, muchas veces los lenguajes y simbolos permitidos
# strict_types
Ayuda a mantener ciertas reglas respecto al auto-casting que es muchas veces realizado por PHP, mantiene un poco mas el orden.
| |
# Incluir otros Archivos PHP
Existen multiples formas de traer otros archivos PHP a otros. Todos ellos requieren que proporciones el path relativo hacia el archivo.
En caso de que un path no se especifique los archivos seran especificados desde el path definido en php.ini. Si no se encuentra ahi, lo buscara en el mismo directorio donde esta el archivo que require el script.
- require
- require_once
- include
- include_once
La diferencia entre include y require esque include resulta en un warning y require en un error al ejecutar un script.
- include == warning. No detiene ejecucion
- require == error. Detiene ejcucion
La dfierencia entre once y los que no tienen once esque los once solo importan el archivo una vez aunque el statement se encuentre varias veces, contrario a los que no lo tienen.
# Funciones
Caracteristicas especiale sde las funciones
- Son hoisted (son llevadas al top y ejecutadas primero)
- Se pueden definir de forma anidada. Mala practica
- Se pueden definir de forma condicional. Mala practica
- Se puede hacer typehint
- Se puede hacer un retorno opcional utilizando el operador ? antes de poner el typehint
- Hacer typehinting en los parametros de la funcion
- Puedes utilizar el pipe para crear union en los parametros
- Puedes definir valor por defecto a los parametros utilizando ‘=’
- Puedes pasar argumentos a una funcion dandoles etiquetas de nombres
- return $x; }
foo(x: 7);
function bar(): ?string { return; // Valido debido a que el retorno es opcional }
| |
Una funcion anonima es del tipo “callable”. Muchas veces estas son utilizadas como argumentos para otras funciones como array_map
| |
# Arrow Functions
Es sintactic sugar para escribir funciones anonimas de forma mas comoda con unas pocas diferencias. Es util como una inline anonymous function.
| |
# Fechas & Time Zones
Tenemos la funcion time() para ver los segundos en UNIX (desde 1 ene 1970).
Tenemos la funcion date() para formatear cualquier fecha en UNIX a un string bonito.
- date_default_timezone_get. Te permite obtener la zona horaria actual
- date_default_timezone_set. Te permite colocar una zona horaria
- wktime. Te permite definir un tiempo desde ahora hacia adelante
- str_to_date. Te permite convertir un string a fecha
# Funciones de Arrays
Algunas funciones relevantes tenemos:
- array_chunk(array, length). Te permite dividir un array en multiples arrays
- array_combine. Te permite crear un array asociativo entre dos arrays recibidos como argumentos, el primer array sera las keys el segundo los values.
- array_filter. Itera sobre cada elemento y lo pasa por el callback, si se devuelve true el elemento pasa si no no.
- array_values. Retorna los valores de un array
- array_keys. Retorna las keys de un array
- array_map. Itera sobre los elementos y les aplica el callback que se pase.
- array_merge. Merge dos arrays, en caso de encontrar elementos repetidos (mismo key) sobreescribe
- array_reduce. Reduce todos los elementos del array a un solo valor
- array_search. Busca un valor en el array
- array_diff. Retorna las diferencias del primer array contra todos los otros
- array_diff_assoc. Retorna las diferencias incluidos con sus keys
- array_diff_key. Retorna las diferencias entre el primer array contra los otros por sus llaves
- asort. Ordena el array por sus valores
- ksort. Orden el array por sus llaves
- usort. Ordena el array basada en la funcion que se le pase
- destructuring. Adicionalmente, tambien podemos deestructurar como en JS
# OOP
La sintaxis de las clases es bastante parecida a Java:
| |
# Constructor
Los constructores se definen como la funcion __construct. Estos son los inicializadores de objetos
# Instancias
Para instanciar objetos utilizamos la keyword new igual que en todos los lenguajes
# Type Hinting
Tambien podemos hacer type-hinting de los tipos de valores que deben tener los atributos de los objetos.
# Modificadores de acceso
Al igual que en Java, existen modificadores de acceso. En el caso de php tenemos estos tres:
- private. Unicamente lo ve la clase actual
- protected. Lo ve la clase actual y sus subclases
- public. Lo ve todo el mundo
# Null Safe Operator
Es un operador que sirve para obtener las propiedades de forma segura colocando el operador null que me asegura que si un valor es null no tratara de acceder a las propiedades siguientes.
| |
# Name Spaces
Cuando defines una variable, clase, u otra cosa en un script de PHP estos se definen por defecto en el Global Space, esto quiere decir que estas se encontraran disponibles en todos lados desde todos los archivos que importen el script.
Sin embargo, tenerlas de esta forma puede generar colisiones puesto que varias mismos elementos con el mismo nombre se pueden requerir desde dos mismos scripts.
Esto mismo pasa con clases, funciones, clases abstract,as interfaces y constantes.
Un namespace es como un paquete. En PHP podemos definirlo utilizando namespace en top del archivo y antes de cualquier codigo, pero despues de los declare().
| |
La practica comun es matchear tu namespace y la estructura de tus carpetas.
Una vez tenemos definido un namespace y sus componentes, podemos importarlos utilizando use desde otro fichero:
| |
En caso de no proporcionar este importe, la clase sera buscada en el namespace actual y si no se encuentra, se tirara un error. Esto no aplica para constantes y funciones, en caso de no encontrarla en el namespace actual se ira directamente a buscar en el global.
# Aliasing
Digamos que utilizamos dos clases con el mismo nombre desde diferentes paquetes. ¿Como podriamos diferenciar entre ellas?. Una forma de hacerlo (y la mejor) es darles un alias
| |
# Multiples Importes
Adicionalmente tambien podemos importar diferentes clases del mismo namespace:
| |
# Autoloading
Es un mecanismo que sirve para cargar todas las clases, interfaces y traits que no esten incluidos en el archivo actual (Con require o include).
Podemos definir autoloaders manualmente, los cuales reciben un callback como parametro y que son ejecutados en forma de cola:
| |
# PSR-4
El codigo en PHP puede ser extremadamente dificil de leer, PSR-4 es una convencion (estandar) para escribir codigo.
Muchas extensiones sirven para proveer consistencia al codigo.
# Composer
Es una herramienta para manejar las dependencias en PHP, te permite manejar dependencias y el Autoloading.
Para instalarlo, puedes hacerlo descargando el archivo e instalandolo.
Si estas en un contenedor de Docker, puedes utilizar curl e instalarlo usando php.
Para conseguir paquetes puedes buscar en Packagist.
# Instalar un Paquete
Para instalar un paquete debemos hacerlo desde la terminal utilizando el comando “composer”:
| |
# Estructura
Tras instalar un paquete y todas sus dependencias se te generara una serie de archivos:
- composer.json Trae la configuracion junto con todas las dependencias que tiene el proyecto
- composer.lock Lockea las dependencias a un estado arreglado, este tiene las dependencias, referencias, versiones y todo . Este es el archivo que deberia ser comiteado a git.
- vendors/. Folder donde se encuentra todo el codigo fuente de tus dependencias.
Al hacer composer install va a buscar si una rchivo composer.lock existe, si lo hace, instalara todas las dependencias que se encuentren ahi, utilizando las versiones exactas. En caso de que no exista, va a generarla desde cero.
# Autoload
Por defecto, composer tambien trae un autoloader, podemos utilizarlo importandolo a nuestro archivo:
| |
Sin embargo, este solo funciona con los paquetes externos, para que funcione con los paquetes locales debemos configurarlo:
| |
Ahora necesitamos regenerar los archivos de composer para que haga autoload.
| |
Una vez regeneradas, deberiamos tener acceso a todo.
Para produccion debemos generar el mismo autload con optimizacion:
| |
Esto generara el archivo autoload_classmap.php con todas las clases generadas que la aplicacion necesita.