dependencies

OOP | Métodos de Clase

     Es el momento de sacar uno poco más de provecho al uso de clases, porque aunque dentro de una Clase y de un Array podremos incluir datos, sólo dentro de una Clase podremos ejecutar funciones, conocidas también como Métodos.

     Un método no es más que una función, en la que podremos ejecutar código encapsulado que habita dentro de la clase. Existen varios tipos de Métodos, pero vamos a empezar poco a poco.

     Vamos a añadir un método al que llamaremos public function arrancarVehiculo(){}, dentro de nuestra clase Vehículo, así podremos ver y entender mejor el uso de los Métodos dentro de una clase. Añadiremos el siguiente código dentro de nuestra clase:

<?php

// Definimos la clase
class Vehiculo
{
  public $marca;

  public function encenderVehiculo ()
  {
     print 'RRRRUUUUUUUMMMMMMMM !!!!!!';
  }
}

     Con este nuevo código, ya hemos añadido un método, que nos devolverá en pantalla, el sonido de arranque del motor de nuestro vehículo. Ahora para realizar la llamada a este método, como ya hemos creado nuestro objeto, escribiremos el siguiente código:

// Ejemplo llamada a un método
$miNuevoVehiculo->encenderVehiculo();

     La diferencia entre llamar a una propiedad de la clase y a uno de sus métodos, es que al final del Método tendremos los paréntesis.

     El código completo que deberías tener en tu archivo de pruebas, será el siguiente:

<?php

// Definimos la clase
class Vehiculo
{
  public $marca;

  public function encenderVehiculo ()
  {
     print 'RRRRUUUUUUUMMMMMMMM !!!!!!';
  }
}

// Ejemplo de un objeto
$miNuevoVehiculo = new Vehiculo();
$miNuevoVehiculo->marca = 'Mercedes Benz';

// Imprimiremos en pantalla nuestro primer objeto
print "La marca de mi vehículo es: " . $miNuevoVehiculo->marca;
print '<hr>';
// Ejemplo llamada a un método
$miNuevoVehiculo->encenderVehiculo();

     Ahora, si guardarmos los cambios y refrescamos el navegador, deberíamos ver en pantalla el siguiente resultado:

OOP PHP | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Excelente!!!, ya nada nos detendrá, porque acabamos de poner el motor en marcha y no vamos a deternos hasta alcanzar la meta.

     Recuerda, los Métodos son iguales a las funciones tradicionales, la diferencia está en que habitan dentro de la clase, por esta razón, para acceder a ellos, debemos hacerlo a través de los objetos de esa clase.

   Cómo acceder al valor de una propiead a través de Métodos

     Los Métodos, al igual que las funciones, también pueden ser empleados para obtener datos y devolverlos. En este caso añadiremos un segundo método a nuestra clase, con el objetivo de que nos devuelva el nombre de la marca del Vehículo. Pero primero vamo a añadir un texto estático, para comprobar que todo funciona:

// Ejemplos llamada a un método
$miNuevoVehiculo->encenderVehiculo();
print '<hr>';
print $miNuevoVehiculo->getBrand();

     Si refrescamos el navegador, deberíamos ver el siguiente resultado:

OOP PHP | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Correcto, ya tenemos el resultado esperado, pero nos surge una nueva incógnita, ya sabemos que para acceder a la propiead del objeto, solo hace falta añadir la fecha antes del nombre de la propiead, pero en este caso, ¿Cómo podremos hacer, para que el método nos devuelva el nombre de la propiedad $brand, en este caso? 

     Para acceder a los valores desde dentro de un Método de clase, existe la variable especial llamada $this, en ella podremos acceder a los valores que existan dentro de la clase en la cuál reside nuestro método. La manera de llamar a la propiedad dentro del Método, utilizando $this, es la siguiente:

public function getBrand()
{
   return $this->brand;
}

     Una vez hagamos el cambio en nuestro Método y guardemos, podremos refrescar el navegador, para descubrir que ahora se muestra la marca de nuestro Vehículo, en lugar del texto estático que habíamos añadido al principio.

OOP PHP | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Por ahora, nuestra clase Vehículo{}, sólo tiene una propiedad $brand, así que es el momento de probar otras opciones. Abriremos nuestro archivo functions.php y añadiremos el resto de características, comunes para todos los vehículos de nuestro listado:

public $brand;
public $year = 0;
public $color;
public $price =0;

     En este caso, he añadido el valor por defecto cero ( 0 ), a las propiedades referentes al año y al precio del vehículo, ya que no las hemos utilizado nunca, así evitamos posibles fallos en las llamadas, a nuestros objetos durante el desarrollo del código.

   Vamos a realizar una prueba llamando a la propiedad $year; para ello ejecutaremos un var_dump(). Si guardamos el cambio y refrescamos el navegador, debería devolvernos el valor por defecto, que será igual a cero (0):

OOP PHP | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Ahora podremos asignarle un valor y volver a comprobar si todo funciona según lo esperado.

// Ejemplo de un objeto
$miNuevoVehiculo = new Vehiculo();
$miNuevoVehiculo->brand = 'Mercedes Benz';
$miNuevoVehiculo->price = 30;

     Si refrescamos el navegador, podremos comprobar que se ha realizado el cambio y ahora el precio que se muestra es el número que hemos añadido:

OOP PHP | www.drupaladicto.com - Consultor especializado en drupal y symfony

   Añadiendo complejidad al Método

     En el caso de los método anteriores, el resultado es muy simple, así que vamos a sacarle un poco más de provecho a los métodos en el siguiente ejemplo. Crearemos un nuevo método al que llamaremos getDeatilsVehicle(){}, el propósito de este nuevo método será obtener todos los detalles de un Vehículo inmediatamente:

public function getDetailsVehicle()
{
  return sprintf(
    '%s Y: %b C: %s P: %d',
       $this->brand,
       $this->year,
       $this->color,
       $this->price
  );
}

     Este método devolverá un resumen con todas las propiedades de nuestro objeto. Si quieres saber más sobre esta función HAZ CLIC AQUÍ

     Una vez hayamos completado nuestro Método, podremos llamarlo, al igual que hicimos con los anteriores:

// Otros ejemplos con métodos y propiedades
print $miNuevoVehiculo->getDetailsVehicle();

     Si refrescamos el navegador, el resultado obtenido en pantalla debería ser como el siguiente:

OOP PHP | www.drupaladicto.com - Consultor especializado en drupal y symfony

OOP | Clases y Objetos, diferenciación

    Antes de comenzar con las explicaciones sobre la diferencia que existe entre una Clase y un Objeto, vamos a crear un archivo en el que podamos realizar diferentes pruebas, que nos permitirán entender mejor los conceptos que iremos explicando.

    En mi caso el nombre de mi archivo será pruebas.php y estará en la carpeta raiz. Una vez creado el archivo, hagamos print, para comprobar que el archivo funciona correctamente si lo abrimos en el navegador.

OOP PHP | www.drupaladicto.com - Consultor especializado en drupal y symfony

OOP PHP | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Ahora que ya hemos comprobado que todo funciona correctamente, intentaré explicarte con un ejemplo práctico, el uso de las clases y objetos. Lo primero que tendríamos que saber es que cómo se define una clase.

   Cómo definimos una Clase

     Para definir una clase de PHP, lo único que hará falta es escribir la palabra reservada classs, seguida del nombre de nuestra clase; para nombrarla, podremos utilizar casi todo tipo de valor alfanumérico; a continuación abriremos y cerraremos llaves. Todo lo que incluyamos dentro de estas llaves, será el contenido de nuestra clase.

class Vehiculo 
{

}

     El funcionamiento de una clase es muy parecido al de un array, sólo que en lugar de usar Clave => Valor, en una clase utilizaremos Propiedades.

     Si añadimos nuestra clase, a nuestro archivo de pruebas.php y guardamos los cambios, podremos comprobar que tendremos el mismo resultado, ya que nuestra clase todavía no tiene contenido y no provoca ningún error o cambio en al presentación de nuestro código actual.

  Qué son objetos y cómo podemos crearlos

      Los objetos son instancias de una clase, esto significa, que cuando tenemos una clase definida, podremos instanciar tantos objetos como nos hagan falta, utilzando como punto de partida, la clase que hemos definido.

     Para definir un nuevo objeto, lo único que tendremos que hacer es, una vez definida nuesta clase, añadiremos una variable con el nombre para nuestro objeto, y como valor de éste, agregaremos la palabra reservada new, seguida del nombre de nuestra clase y luego, abriremos y cerraremos paréntesis. Terminamos la definición de nuestro objeto, cerrando con punto y coma. 

     Provemos un ejemplo, vamos a crear el objeto de la clase Vehículo:

<?php

// Definimos la clase vehiculo
class Vehiculo
{

}

// Ejemplo de un objeto
$miNuevoVehiculo = new Vehiculo();

     Si añadimos nuestra clase, a nuestro archivo de pruebas.php y guardamos los cambios, podremos comprobar que tendremos el mismo resultado, ya que nuestro objeto todavía no tiene ninguna funcionalidad y, por lo tanto, no provoca ningún error ni cambio en el resto del código.

   Comparativa entre Array, Clase y Objeto

      Cuando trabajamos con Arrays (Arreglos), podemos añadir dentro de este cualquier tipo de dato, con la estructura Clave => Valor, pero no nos permitirá configurar un tipo de datos específico, para rellenar el apartado de los valores. Esto significa que no tendríamos control para evitar la inclusión de datos no permitidos que pudieran hacer fallar nuestra aplicación.

     El Array, al igual que la Clase, funcionan como una plantilla en blanco, donde podremos incluir varios datos.

     La gran diferencia de una Clase, con respecto al Array, es que dentro de la clase tendrá que registrarse previamente, todo lo que podrá ejecutarse dentro de ésta.

     Los Objetos, son estas instancias de la Clase, o sea, en la clase de definen las Propiedades y los Métodos, que estaremos autorizados a utilizar en cada nuevo objeto que vayamos creando, a partir de nuestra clase. 

OOP PHP | www.drupaladicto.com - Consultor especializado en drupal y symfony

   Ejemplo Gráfico sobre Clase y Objeto

       Imaginemos que somos vendedores de vehículos nuevos y usados, y que necesitaremos crear un programa en el que podamos registrar y actualizar fácilmente, todo nuesro inventario de vehículos. 

      Partiendo del gráfico y el contenido explicado anteriormente, en este ejemplo, crearemos nuestra Plantilla o Clase, a la que llamaremos Vehículo, y pondremos dentro todas sus Características, Propiedades de la clase.

     Una vez hayamos definido todos los elementos a los cuales podremos acceder, entonces sólo nos faltará crear las diferentes instancias de esta clase, que correspondería, a cada uno de los vehículos que iremos agregando o eliminando de nuestro inventario.

OOP PHP | www.drupaladicto.com - Consultor especializado en drupal y symfony

OOP PHP | www.drupaladicto.com - Consultor especializado en drupal y symfony

OOP PHP | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Ahora que ya hemos entendido la diferencia entre Array, Clases y Objetos, es el momento de escribir código; así que en nuestro archivo de ejemplo crearemos dos instancias de la clase Vehiculo y lo imprimiremos en pantalla.

<?php

// Definimos la clase
class Vehiculo
{
  public $marca;
}

// Ejemplo de un objeto
$miNuevoVehiculo = new Vehiculo();
$miNuevoVehiculo->marca = 'Mercedes Benz';

// Imprimimos en pantalla nuestros primeros objeto
print "La marca de mi vehículo es: " . $miNuevoVehiculo->marca;

 

OOP PHP | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Repasando: La diferencia fundamental entre un Array y una Clase, es que para comprobar los valores dentro de un array, tendríamos que ejecutar un vardump(); sin embardo, cuando trabajamos con Clases, ya sabremos su contenido, antes de que podamos incluso crear los objetos. Piensa en una clase como el esqueleto o esquema que debemos seguir, para obtener resutados coherentes en el desarrollo de nuestra aplicación.

     Otras de las ventajas de trabajar con Clases, es que dentro de ellas, podremos ejecutar funciones, también conocidas como Métodos. Eso lo explicaremos en el siguiente capítulo.

    Felicidades!!!, ya podrás presumir de que al menos conoces uno de los fundamentos de la Programación Orientada a Objetos, al definición de clases y la creación de Objetos a partir de ella; así que estás prepárate para el siguiente paso: Los Métodos

OOP | Configuración de proyecto con Lando

Video de Youtube
URL de Video remoto

Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... HAZ CLIC AQUI

     Quiero darte la bienvenida a esta nueva serie de artículos y videos, donde trataré de explicarte los conocimientos básicos, sobre la Programación Orientada a Objetos en PHP, conocida también como OOP.

     La idea principal es darte un punto de partida, para que puedas comenzar a explorar y entender, el desarrollo de aplicaciones web mediante el uso de clases y objetos, a través de pequeños ejemplos prácticos, y de esta forma, ayudarte a entender el código en el que están basados, la mayoría de los Frameworks y CMS, como Symfony, Laravel, Drupal y Worpress, que se encuentran actualmente, en la mayoría de aplicaciones a las que tenemos acceso cada día.

     Para nuestros ejemplos, he optado por utilizar Lando, con un Recipe LAMP, ya que considero que es la forma más rápida y sencilla de configurar un entorno de desarrollo completo, sin importar el sistema operativo de tu ordenador.

     Si todavía no conoces Lando, es un sistema basado en contenedores de Docker, que nos ayuda a configurar entornos de desarrollo, estables y totalmente personalizables, facilitando enormemente el proceso de configuracion de servidores, así como la capacidad de compartir dicha configuración, entre todos los miembros de tu equipo de trabajo.

     Si quieres ver el video de instalación de Lando, HAZ CLIC AQUÍ

   Configuración de nuestro entorno de desarrollo con Lando

        Una vez hayamos realizado nuestra instalación de Lando, crearemos una carpeta en la que guardaremos todos los ejemplos, con los que iremos trabajando a través de esta serie de artículos y videos. En mi caso, he obtado por llamarla oop, pero puedes ponerle el nombre que prefieras. 

        Dentro de esta carpeta colocaremos dos arcihvos principales: index.php y functions.php

     Paso 1 - Creacion y configuración del servidor con Lando

        Antes de comenzar a trabajar con estos archivos, tendremos que inicializar Lando, con el comando lando init y luego seleccionaremos lamp, para que la instalación se correspondiente al servidor con Linux, Apache, Php y Mysql. Así, que una vez hallamos creado nuestra ca

lando init


      El resultado final de la inicialización para nuestro archivo será la siguiente:

? From where should we get your app's codebase? current working directory
? What recipe do you want to use? lamp
? Where is your webroot relative to the init destination? .
? What do you want to call this app? oop

     Si abrimos el archivo de configuración .lando.yml, el aspecto debería ser el siguiente:

name: oop
recipe: lamp
config:
  webroot: .

        Ahora que tenemos nuestro archivo de inicialización para Lando, listo para arrancarlo, pasaremos a crear nuestras páginas correspondientes.

   Paso 2 - Creación del archivo functions.php para las funciones

        Crearemos el archivo donde estarán alojadas nuestras clases, llamado functions.php, y pegaremos el siguiente código, que por ahora sólo tendrá una función que devuelve un array de arrays, con detalles relacionados a varios vehículos y sus detalles:

<?php

function get_cars(){
 return [
   'Mercedes' =>[
       'brand' => 'Mercedes Benz',
       'year' => 2020,
       'color' => 'blanco',
       'price' => 1500
   ],
     'Volvo' =>[
         'brand' => 'Volvo',
         'year' => 2019,
         'color' => 'azul',
         'price' => 1000
     ],
     'KIA' =>[
         'brand' => 'Kia',
         'year' => 2021,
         'color' => 'negro',
         'price' => 500
     ],
     'Ford' =>[
         'brand' => 'Ford',
         'year' => 2022,
         'color' => 'rojo',
         'price' => 850
     ],
    ];
}

     Explicación:

        Una de las formas de reutilizar nuestro código en PHP, al igual que en otros lenguajes de programación, es el uso de funciones, ya que podremos llamarlas desde cualquier lugar dentro de nuestro proyecto, evitando tener que repetir ciertos procedimientos. En esta ocasión, el objetivo de la función function get_cars(), es devolver un listado de vehículos, estructurados en forma de arrays asociativos, si quieres saber más sobre los Arrays, visita la página oficial de PHP.

   Paso 3 - Creación del archivo index.php

        En el archivo index.php, es donde mostraremos el listado de vehículos, que nos vendrá al importar los datos desde el archivo functions.php, por lo tanto, copiaremos el siguiente código:

<?php
require __DIR__ . '/functions.php';

$autos = get_cars(); ?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
          integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
</head>
<body>
<div class="container mt-5" style="background-color: #a5deea; border: 2px solid #071138;">
    <div class="d-flex flex-lg-column p-5 justify-content-center">
        <h1 class="p-2 bd-highlight text-center">Vehículos de ocasión</h1>
        <table class="table table-hover">
            <thead class="table-primary">
            <tr>
                <th scope="col">Marca</th>
                <th scope="col">Año</th>
                <th scope="col">Color</th>
                <th scope="col">Precio</th>
            </tr>
            </thead>

            <tbody>
            <?php foreach ($autos as $key => $auto): ?>
                <tr>
                    <td><?php echo $auto['brand']; ?></td>
                    <td><?php echo $auto['year']; ?></td>
                    <td><?php echo $auto['color']; ?></td>
                    <td><?php echo $auto['price']; ?></td>
                </tr>
            <?php endforeach; ?>
            </tbody>
            <tbody>
        </table>
    </div>
    <div class="d-flex flex-lg-column p-5 text-center bg-primary text-white mb-5">
        <?php
        if (!isset($_POST['submit'])) {
            echo "<h3>Selecciona el vehículo que quieres comprar</h3>";
        } else {

            $name = $_POST['vehicle_name'];
            echo "Haz seleccionado un vehículo de la siguiente marca : <h2 class='p-3 mt-3'> $name </h2>";
            echo "<br>Puedes cambiar tu selección, haciendo clic en el selector nuevamente";
        }
        ?>
        <form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
            <div class="d-flex flex-row justify-content-center p-5">
                <select style="max-width: 300px; border: 1px solid #fff"
                        class="form-select center-block form-control btn drp-dwn-width btn-default btn-lg dropdown-toggle mb-5"
                        name="vehicle_name">
                    <option value="">Selecciona aquí tu vehículo</option>
                    <?php foreach ($autos as $key => $auto): ?>
                        <option value="<?php echo $key; ?>"><?php echo $auto['brand']; ?></option>
                    <?php endforeach; ?>
                </select>
            </div>
            <input class="btn btn-warning" type="submit" name="submit" value="Comprar"><br>
        </form>
    </div>
</div>

<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js"
        integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM"
        crossorigin="anonymous"></script>
</body>
</html>

     Explicación:

        Lo primero que vemos en este archivo, es que, a pesar de tener la extensión .php, en su interior encontraremos un híbrido entre código php y html; esta combinación será la que nos permita extraer los valores de php desde el archivo functions.php y mostraros en el formato html.

        Por esta razón, al principio del archivo, lo primero que debemos verificar, es que hemos incluido esta dependencia, para ello hemos utilizado la directiva require, acompañada de los parámetros de la ubicación de nuestro archivo functions.php:

require __DIR__ . '/functions.php';

        Justo debajo de esta línea, hemos declarado una variable de php, a la cual llamamos $autos y, a continuación, le hemos asignado el valor de nuestra función, permitiéndonos extraer toda la información incluida en su interior.

$autos = get_cars(); ?>

        Por último, tenemos el apartado donde imprimimos todos los valores dentro del array, para que se muestren en la tabla de vehiculos de ocasión, mediante un bucle foreach:

<tbody>
<?php foreach ($autos as $key => $auto): ?>
    <tr>
        <td><?php echo $auto['brand']; ?></td>
        <td><?php echo $auto['year']; ?></td>
        <td><?php echo $auto['color']; ?></td>
        <td><?php echo $auto['price']; ?></td>
    </tr>
<?php endforeach; ?>
</tbody>

   Paso 4 - Arrancar el servidor con el comando de Lando

     Una vez hayamos guardado los cambios correspondientes, podremos arrancar lando y accederemos la url que se nos generará utomáticamente, donde veremos una pequeña aplicación, con un listado de vehículos y un formulario, para realizar una compra ficticia, que sólo es un select dentro de un formulario y se imprime el valor seleccionado en pantalla:

lando start

 

OOP PHP | www.drupaladicto.com - Consultor especializado en drupal y symfony

   Paso 5 - Comprobación en el navegador

        En cuanto tengamos el servidor funcionando, podremos hacer clic en los enlaces que se nos mostrarán en pantall, al terminar de ejecutarse el anterior comando lando star, y entonces, si hacemos clic sobre uno de ellos, o copiamos en el navegador una de las direcciones, deberíamos ver en pantalla, nuestra aplicación para pruebas, funcionando correctamente con un aspecto parecido al de la siguiente imagen:

     Ahora que ya tenemos configurada nuestra aplicación de pruebas, podemos comenzar a optimizarla utilizando las clases y objetos de php... ¡Adelante!

OOP - Programación Orientada a Objetos | Presentación

Video de Youtube
URL de Video remoto

Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... HAZ CLIC AQUI

     En esta serie de videos trataré de explicarte, los conocimientos básicos sobre la programación con PHP Orientada a Objetos (OOP). Mi idea es incluir varios ejemplos prácticos donde aprenderás a diferenciar entre Clases y Objetos, Propiedades y Métodos, Inyección de dependencias, creación de una API, entre otros.

drupal/graphql 4.4.0 requires drupal/typed_data *

     Cuando realizamos una instalación de la versión 4.4 de Graphql, utilizando composer, es posible que nos econtremos con un error, debido a su dependencia con el módulo typed_data.

drupal/graphql 4.4.0 requires drupal/typed_data * -> found drupal/typed_data[dev-1.x, 1.0.0-alpha1, ..., 1.x-dev (alias of dev-1.x)] but it does not match your minimum-stability.