🌱 Digital Garden

Search

Search IconIcon to open search

PHP

Last updated Aug 6, 2023 Edit Source

# 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:

1
2
echo();
print();

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

1
echo 'hola', ' ', 'mundo';

Y variables utilizando un punto

1
echo 'hola ' . $name;

# 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

1
2
echo "Hola me llamo {$name}"; // Funciona
echo 'Hola me llamo {$name}'; // No funciona

# 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:

1
2
3
4
5
$x = 1;
$y = $x;

$x = 3;
echo $y; // 1

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 &

1
2
3
4
5
$x = 1;
$y = &$y;

$x = 3;
echo $y; // 3

# Constantes

Existen dos formas principales de definir constantes

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

1
2
3
define('STATUS_CODE', '200');

echo STATUS_CODE; // 200

# 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 $$.

1
2
3
4
5
$foo = 'bar';
$$foo = 'zas'; // $$foo == $bar

echo $$foo; // zas
echo $bar // zas

# Tipos de Datos

Hay diez tipos de datos basicos en PHP:

# 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

1
2
$x = 2.34;
var_dump($x);

# 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.

1
2
3
4
5
6
7
function sum(int $x, int $y) {
	return $x + $y;
}

echo sum(2, 3) // 5
echo sum(2.7, 3) // 5
echo sum(2, '3') // 5

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:

1
declare(strict_types=1);

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

1
2
$x = (int) '5'; 
var_dump($x); // int(5)

# 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

1
2
3
4
5
6
7
// Falsy values
// 0 -0
// 0.0 -0.0
// ''
// '0'
// []
// null

# Array

Es una estructura de datos basica, en PHP, parece estar soportada por una lista / mapa.

1
$array = ['Uno', 'Dos', 'Tres'];

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.

1
$array[] = 'Cuatro';

Otra forma es utilizando la funcion array_push()

1
array_push($array, 'Cinco', 'Seis', 'Siete');

# 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:

1
2
3
4
5
$array = [
	'key' => 'value',
	'key' => 'value',
	'key' => 'value',
]

# Remover

Para remover un elemento tenemos dos metodos bastante utiles array_pop y array_shift.

1
2
3
$array = ['A'. 'B', 'C', 'D'];
echo array_shift($array); // A
echo array_pop($array); // D

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

1
unset($array[1]) // B

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:

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)

1
echo fmod(10.5, 2.5) // 1.80003

# Strings

Los Strings tienen un unico operador que sirve para concatenar, tambien lo tienen en forma de apender al final de string:

1
2
3
$h = 'Hello'
$h = $h . ' World'; // Hello World
$h .= '!'; // Hello World!

# Comparacion

Al igual que en JavaScript existen dos operadores para hacer comparacion directa:

1
2
var_dump(3 === '3') // false
var_dump(3 == '3') // true

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

1
2
3
var_dump(3 <=> 5); // -1
var_dump(3 <=> 3); // 0
var_dump(3 <=> 1); // 1

Null Coalescing Es otro operador que nos sirve para dar un valor por defecto en caso de encontrarnos con un null.

1
2
3
$x = null;
$y = $x ?? 'El valor era null';
echo $y; // El valor era 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.

# Expresion Match

Bastante similar al Switch expression, fue introducida en PHP 8-

1
2
3
4
5
6
match ($expression) {
	1 => echo('Paid'),
	2,3 => echo('Payment Declined'),
	4 => echo('Pending Payment')
	default => echo('Unknown')
}

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.

1
2
3
4
5
6
7
8
// Funcion que se ejecutara
function onTick() {
	echo ('<br>'); 
}

register_tick_function('onTick'); // Se registra la funcion a ejecutar cuando el evento ocurra

declare(tick=1); // 1 Tick para triggerear el evento

# 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.

1
declare(strict_types=1);

# 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.

La diferencia entre include y require esque include resulta en un warning y require en un error al ejecutar un script.

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

foo(x: 7);

function bar(): ?string { return; // Valido debido a que el retorno es opcional }

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15

## Scopes
Existen dos scopes basicos
- global. Disponible en el mismo script y en todos los scripts que importen este mismo.
- local. Contenidas dentro de metodos y funciones

Existen variables estaticas que son compartidas por la funcion siempre, es decir, solo existe una para todas las veces que se ejecute la misma funcion.

## Funciones Anonimas
Son un tipo de funciones que no tienen nombre. Estas pueden ser asignadas a una variable. Pueden ser utilizadas como callback functions.

```PHP
$printer = function (int|float $num) {
	echo($num);
}

Una funcion anonima es del tipo “callable”. Muchas veces estas son utilizadas como argumentos para otras funciones como array_map

1
2
3
array_map(function($element) {
	return $element * 2;
}, $array);

# Arrow Functions

Es sintactic sugar para escribir funciones anonimas de forma mas comoda con unas pocas diferencias. Es util como una inline anonymous function.

1
2
3
$arr = [1, 2, 3, 4];

array_map(fn($number) => $number * $number, $arr) // fn($args) => operacion;

# 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.

# Funciones de Arrays

Algunas funciones relevantes tenemos:

# OOP

La sintaxis de las clases es bastante parecida a Java:

1
2
3
4
5
6
7
8
9
class Name {
	private int $property1;
	private string $property2;

	public function __construct(int $property1, string $property2) {
		$this->property1 = $property1;
		$this->property1 = $property1;
	}
}

# 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:

# 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.

1
$customer?->profile?->transaction?->id;

# 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().

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
declare(strict_types=1);
namespace MyPackage\Name;

class Person {
	private string $value;

	public function __construct(string $name) {
		$this->value = $name;
	}
}

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:

1
2
3
use MyPackage\Name\Person;

$person = new Person('Jaime');

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

1
2
use PaymentGateway\Paypal\Transaction as PaypalTransaction;
use PaymentGateway\Stripe\Transaction as StripeTransaction;

# Multiples Importes

Adicionalmente tambien podemos importar diferentes clases del mismo namespace:

1
use PaymentGateway\Paypal\{ClientProfile, Transaction, Payment}

# 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:

1
2
spl_autoload_register(fn($class) => echo ("Loader 1"));
spl_autoload_register(fn($class) => echo ("Loader 2")); 

# 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”:

1
composer require <name>

# Estructura

Tras instalar un paquete y todas sus dependencias se te generara una serie de archivos:

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:

1
require __DIR__ . '/../vendor/autoload.php';

Sin embargo, este solo funciona con los paquetes externos, para que funcione con los paquetes locales debemos configurarlo:

1
2
3
4
5
6
// Dentro de composer.json
"autoload": {
	"psr-4": {
		"Namespace": "location/"
	}
}

Ahora necesitamos regenerar los archivos de composer para que haga autoload.

1
composer dump-autoload

Una vez regeneradas, deberiamos tener acceso a todo.

Para produccion debemos generar el mismo autload con optimizacion:

1
composer dump-autoload -o

Esto generara el archivo autoload_classmap.php con todas las clases generadas que la aplicacion necesita.

# Class Constants