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).
Para quien tenga habilidades, experticia en programación y/o requiera agilidad en conceptos técnicos, pueden resumirse los siguientes tips esenciales del lenguaje:
$
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.function
, luego los parámetros van entre paréntesis (...)
, separando los parámetros con coma ,
. Además, se usa return
para retornar un valor.{}
. Las sentencias deben terminar siempre con punto y coma ;
.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
).function __constructor
(siendo una función) y la clase se define con la palabra reservada class
y el nombre.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).<html>
<body>
<?php
echo "Hi there!";
?>
</body>
</html>
Se observa que se indica el trozo de código colocando
<?php
y cerrando con?>
. La sentenciaecho
se usa para dirigir un texto a la salida, es decir, reescribe dinámicamente elHTML
.
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 usararray(...)
.
function plus($a, $b) {
return $a + $b;
}
# Este es un comentario de una línea entera
// Esto es un comentario de fin de línea
/*
Este es un comentario de bloque
*/
if ($i == 1) {
echo "one";
}
elseif ($i == 2) {
echo "two";
}
else {
echo "aha";
}
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.
while ($i < 10) {
$i++;
}
do {
$i++;
}
while ($i < 10);
// 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.
try {
...
}
catch (Exception $e) {
...
}
finally {
...
}
Puedes usar
throw
(por ejemplo:throw new Exception("Error!")
) para forzar el lanzamiento de un error.
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).
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 |
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!";
}
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);
?>
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
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.
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 connginx
pero podría instalarse en su lugarPHP
paraapache2
usando simplemente:php8.0
Adicionalmente puedes verificar la version dePHP
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 deNginx
sea correcta.
Si se trata de un entorno bajo Windows Subsystem for Linux, cambias el comandosystemctl
porservice
y la instrucciónrestart
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.
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+
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
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
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());
});
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 elegimos0
(básico) o simplemente presionamos la teclaenter
.
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
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