PHP

PHP (Hypertext Preprocessor) es un lenguaje de programación diseñado naturalmente para la Web, éste opera acompañando al servidor web de Apache (Web Server), o alternativamente NGinx. Se puede decir, que es un lenguaje de “script” para procesar hypertexto del lado del servidor. Dado su enfoque original suele ser sencillo para intruducirse en el desarrollo Web. Su nivel de popularidad se relaciona altamente con el marketing digital, gestores de contenido (como WordPress) y servicios de alojamiento web (hosting).

Tips esenciales del lenguaje

Para quien tenga habilidades, experticia en programación y/o requiera agilidad en conceptos técnicos, pueden resumirse los siguientes tips esenciales del lenguaje:

  1. No se requiere especificar tipo de datos en una variable y basta declararla iniciando con el caracter $ como parte del nombre. En este sentido, se identifican las variables refiriéndose a ellas siempre de la misma manera a lo largo del código.
  2. Las funciones se definen con function, luego los parámetros van entre paréntesis (...), separando los parámetros con coma ,. Además, se usa return para retornar un valor.
  3. Para el bloque de la función o el flujo de control se usan llaves {}. Las sentencias deben terminar siempre con punto y coma ;.
  4. El flujo de control es semejante a lenguajes como C, Java, Javascript, Kotlin, es decir que se cuenta con una anatomía cercana para el uso de if, for, while, incluso para el manejo de excepciones (try).
  5. El constructor de una clase se establece usando function __constructor (siendo una función) y la clase se define con la palabra reservada class y el nombre.
  6. Un programa de “script” en PHP siempre inicia con <?php y termina con ?> cuando se trata de un trozo de código dentro de HTML (si se trata de un archivo independiente que contiene sólo código PHP se puede omitir ?> al final, pues no se necesita en ese caso).

Ejemplo esencial

<html>
<body>
    <?php
        echo "Hi there!";
    ?>
</body>
</html>

Se observa que se indica el trozo de código colocando <?php y cerrando con ?>. La sentencia echo se usa para dirigir un texto a la salida, es decir, reescribe dinámicamente el HTML.

Declaración de variables

Se puede declarar variables anteponiendo el caracter $ y no se requiere indicar el tipo de dato, el cual se determina con su asignación. Por ejemplo, las cadenas se establecen entre comillas dobles (""). Para arreglos simplemente se usa la posición entre corchetes ([0]), aunque se puede usar la función array() para inciarlo de modo dinámico.

Ejemplo:

$variable = "Ana";
$n = 5;
$ok = true;
$a[0] = 1;
$a[1] = 2;
$people = array("Ana", "Alex", "Bob");

Para concatenar cadenas se usa simplemente el caracter de punto (.). Por ejemplo: $name = "Ana" . " de " . "Anas";. Parra iniciar arreglos se puede usar array(...).

Definición de funciones

function plus($a, $b) {
    return $a + $b;
}

Comentarios

# Este es un comentario de una línea entera

// Esto es un comentario de fin de línea

/*
   Este es un comentario de bloque
*/

Condicionamiento if / else (elseif)

if ($i == 1) {
    echo "one";
}
elseif ($i == 2) {
    echo "two";
}
else {
    echo "aha";
}

El Ciclo For

for ($i = 1; $i < 10; $i++) {
    echo $i;
}

Para recorrer arreglos, en el punto de validación se hace uso de la función count para contar la longitud de posiciones del vector.

El Ciclo While

while ($i < 10) {
    $i++;
}
do {
    $i++;
}
while ($i < 10);

El Ciclo “foreach”

// With range function
foreach (range(1, 3) as $item) {
    echo $item;
}

// Better example with associate array (like object)
$x = ["a" => 1, "b" => 2, "c" => 3];
foreach ($x as $item) {
    echo $item;
}

Los arreglos asociativos del ejemplo ($x) son como objetos en donde se nombra un elemento y se indica el valor (usando =>), en otras palabras, manejan el concepto de clave y valor.

Excepciones

try {
    ...
}
catch (Exception $e) {
    ...
}
finally {
    ...
}

Puedes usar throw (por ejemplo: throw new Exception("Error!")) para forzar el lanzamiento de un error.

Clases

La programación orientada a objetos (OOP) tiene su propia base de conceptos que abre un capítulo aparte para su comprensión, se puede decir que se pasa de pensar en funciones a clases que agrupan métodos (funciones) y propiedades (variables), siendo de gran útilidad para la reutilización de código. Como referencia simplemente se presenta la anatomía de una clase.

class Persona {
    private $nombre = "Ana";

    public function print() {
        echo $this->nombre;
    }
}

Nótese que se usa $this-> para hacer referencia a la misma instancia de la clase (si conoces otros lenguajes, puedes comprender que en lugar de . se usa -> para acceder a los atributos de la clase).

Funciones básicas incorporadas por el lenguaje

Función Descripción
array Crea un array
count Retorna el numero de elementos de un arreglo
range Usada para aplicar rangos en sentencia foreach
strlen Devuelve la longitud de una cadena
strval Convierte un valor a cadena
intval Convierte una cadena con un numero a entero
str_replace Reemplaza un patrón o caracteres dentro de una cadena
str_split Convierte una cadena en un arreglo de caracteres dada una longitud caracteres (o la unidad)
explode Convierte una cadena en un arreglo según un caracter delimitador (ejemplo: ,)
print_r Imprime el valor de una variable de manera legible y organizada, indicando también su tipo
json_encode Convierte a JSON
json_decode Codifica un valor o cadena como JSON
isset Comprueba si una variable se encuentra definida
strtoupper Deja una cadena en mayúsculas
strtolower Deja una cadena en minúsculas

Formularios Web con PHP (ejemplo esencial)

Para aplicar el esquema o dinámica básica, promovida por PHP en sus origenes en cuanto a formularios, una página inicial invoca a una siguiente. Por ejemplo, un archivo index.php invocaría a process.php. Veamos entonces el contenido del primero (index.php), el cual muestra el formulario inicial.

<!doctype html>
<html>
<head></head>
<body>
    <form action="process.php" method="post">
        <input type="text" name="name" />
        <input type="submit" />
    </form>
</body>
</html>

Para la página de proceso (process.php) se usa una variable global $_POST o $_GET para obtener los datos recibidos, dependiendo del método en el formulario (POST o GET).

<?php
if (isset($_POST["name"])) {
    echo $_POST["name"];
}
else {
    echo "Oops!";
}

Peticiones Web con PHP (cURL)

Veamos esto con un ejemplo de implementación de cliente HTTP que obtiene información de una API…

<?php
    function curl($url) {
        try {
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_HEADER, 0);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            $result = json_decode(curl_exec($curl), true);
            curl_close($curl);
            return $result;
        }
        catch(Exception $e) {
            trigger_error($e->getMessage());
        }
    }
    
    function callRates() {
        $data = curl("http://data.fixer.io/api/latest?access_key=1aad8cf1100eb43ad4fb677a85a783e2&base=EUR&symbols=USD");
        $usd = 0;
        if ($data["success"])
            $usd = 1 / $data["rates"]["USD"];
        return $usd;
    }
    
    $eur = callRates();
    print_r($eur);
?>

Instalación de PHP 8

Para usar PHP bajo Windows es conveniente usar una herramienta como Laragon, la cual viene con su instalador y gestor de servicios incorporados (Web Server, bases de datos, etc.) que simulan un entorno apropiado para PHP en nuestra máquina. Basta con descargar Laragon y proceder a ejecutar su instalador.

Alternativamente, puedes usar Scoop (previamente instalado) ejecutando: scoop install laragon

Instalación de PHP 8 bajo Linux Ubuntu

Para instalar PHP en Linux Ubuntu puede usarse los paquetes del sistema ejecutando desde la línea de comandos lo siguiente:

sudo apt update
sudo apt install php8.1
sudo apt install php8.1-{pgsql,mysql,sqlite3,redis,curl}

Puedes verificar la instalación con el comando: php -v
La última línea instala extensiones que podríamos usar.

Instalación de PHP 8 con Nginx bajo Linux Ubuntu/Debian

Suponiendo que deseas instalar PHP con la última version y con Nginx haciendo de servidor web, entonces puedes ejecutar lo siguiente:

sudo apt update
sudo apt install -y lsb-release apt-transport-https ca-certificates
sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.list
sudo apt update
sudo apt install nginx -y
sudo systemctl enable nginx
sudo apt install php8.0-fpm -y
sudo apt install php8.0-{mysql,curl,mbstring} -y

La última línea instala extensiones del lenguaje PHP (versión 8), por ejemplo, también podrías incorporar entre los corchetes {...,cli,common,snmp,ldap,zip}, o los que identifiques para tu aplicación.
En la penúltima línea se instala la versión compatible con nginx pero podría instalarse en su lugar PHP para apache2 usando simplemente: php8.0
Adicionalmente puedes verificar la version de PHP ejecutando: php -v

Para configurar PHP puedes editar el archivo de configuración /etc/php/8.0/fpm/pool.d/www.conf y establecer los parametros que se ajusten. Por ejemplo, verificamos que la propiedad listen sea igual a /run/php/php8.0-fpm.sock (según la instalación). Luego, para la configuración correspondiente a Nginx se edita el archivo /etc/nginx/sites-enabled/default y en el trozo o bloque que corresponde a PHP (el cual puede encontrarse en comentarios), se establece lo siguiente:

location ~ \.php$ {
        include fastcgi.conf;
        fastcgi_pass unix:/run/php/php8.0-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

Una vez establecida la configuración reinicias los servicios así:

sudo nginx -t
sudo systemctl restart php8.0-fpm
sudo systemctl restart nginx

La sentencia sudo nginx -t valida que la sintaxis de Nginx sea correcta.
Si se trata de un entorno bajo Windows Subsystem for Linux, cambias el comando systemctl por service y la instrucción restart va al final de la línea (despúes del nombre del servicio).

Finalmente, puedes probar PHP creando un archivo, por ejemplo, /var/www/html/info.php con el siguiente código:

<?php
phpinfo();
?>

Consulta en un navegador la dirección de tu servidor y la ruta /info.php para ver el resultado.

Instalación de PHP 8 para macOS

Para instalar PHP en macOS puede usarse Homebrew (previamente instalado) desde la línea de comandos, ejecutando lo siguiente:

brew install php

Puedes verificar la instalación con el comando: php -v
En este ejemplo no se configura un Sevidor Web pero puedes correr servicios con PHP 8+

Instalación de Composer (Gestor de Paquetes)

https://getcomposer.org

curl -s https://getcomposer.org/installer | php
sudo mv ./composer.phar /usr/bin/composer
composer --version

Las sentencias presentadas instalan el gestor de paquetes composer de modo global. La última sentencia nos indica la versión instalada.
Para macOS puede ejecutarse: brew install composer

Veamos el siguiente ejemplo de instalación de un módulo o librería:

composer require gotzmann/comet

Para desinstalar el módulo se ejecutaría:

composer remove gotzmann/comet

Servicio Web con Comet (Framework)

https://github.com/gotzmann/comet

Veamos a continuación un marco de trabajo de PHP para iniciar un servidor web con un estilo semejante a Express (para Node.js). Comet está basado a su vez en Slim Framework (v4), pero mezcla otros componentes que lo hacen más ligero. Veamos un ejemplo de código inicial:

<?php
require_once __DIR__ . '/vendor/autoload.php';
use Comet\Comet;

$app = new Comet();

$app->get('/', function ($request, $response) {              
    return $response->with("Hi there!");
});

$app->run();

Una vez lo guardas y asignas un nombre, por ejemplo app.php, puedes lanzarlo :

php app.php start

Debes haber instalado previamente la librería de comet así: composer require gotzmann/comet
Luego abres en un navegador la dirección: http://localhost:8080

Servicio Web con Leaf PHP (Framework)

https://leafphp.dev

Si buscamos un balance entre simplicidad, eficiencia y características que apoyen la experiencia de desarrollo (componentes para acceso a base de datos y fetch, una curva de aprendizaje baja y buena documentación), es decir, algo más completo y aún sencillo, encontramos el marco de trabajo Leaf PHP (v3).

Para instalar Leaf PHP e iniciar nuestro proyecto ejecutamos lo siguiente:

composer require leafs/leaf
composer create-project leafs/api project
php leaf serve

project corresponde al nombre de nuestro proyecto.
El último comando dejará disponible el servicio la dirección: http:localhost:5500

Podemos ubicar en nuestro proyecto el archivo app/routes/_app.php con un contenido como el siguiente:

<?php

app()->get("/", function () {
    response()->json(["message" => "Congrats!! You're on Leaf API"]);
});

app()->get("/app", function () {
    response()->json(app()->routes());
});

Usando Leaf CLI

También podemos instalar la Leaf CLI (Client Line Interface) para tomar ventaja de las opciones de andamiaje que ofrece Leaf desde la línea de comandos. Para instalar la CLI se usaría el siguiente comando:

composer global require leafs/cli

Sin embargo, es necesario incluir Leaf CLI en el path del sistema, el cual puede variar. Por ejemplo, para Windows se puede encontrar en %UERPROFILE%\AppData\Roaming\Composer\vendor\bin (aunque si usas Laragon te evitas este paso), en macOS sería $HOME/.composer/vendor/bin y en Linux $HOME/.config/composer/vendor/bin.

Una vez configurado el path en el sistema, podemos crear un proyecto ejecutando lo siguiente:

leaf create test-php

Este comando nos preguntará por el tipo de preset (básico, mvc, api, skeleton) y elegimos 0 (básico) o simplemente presionamos la tecla enter.

De este modo, podemos encontrar en nuestro proyecto una API mínima en el archivo index.php con un contenido como el siguiente:

<?php
require __DIR__ . '/vendor/autoload.php';

app()->get('/', function () {
	response()->page('./welcome.html');
});

app()->run();

Para lanzar este proyecto ejecutamos:

leaf serve

Recordemos que el servicio estará disponible usando la dirección: http:localhost:5500

Llamada al sistema con Symphony Process

En el siguiente ejemplo, usaremos Symphony Process para invocar una sentencia desde el sistema operativo, esto puede ser últil para gestionar scripts o tareas de servidor con sistemas como Linux y macOS (o en Windows usando WSL). Para ello podemos ilustrar un código como el siguiente:

<?php
require __DIR__ . '/vendor/autoload.php';

use Symfony\Component\Process\Exception\ProcessFailedException;
use Symfony\Component\Process\Process;

app()->get('/', function () {
    $process = new Process(['python3', 'test.py']);
    $process->start();
    $process->wait();
	response()->json(["message" => $process->getOutput()]);
});

test.py representa un script en Python (puede consistir simplemente en un saludo: print("Hello"))

Instalamos la dependencia necesaria y lanzamos nuestro servicio de la siguiente manera:

composer require symfony/process
leaf serve

© 2020 by César Arcila