La programación orientada a objetos (OOP, Object-oriented programming), un importante paradigma del software, se centra en los «objetos», instancias de clases que incluyen datos y comportamientos en lugar de «acciones»

PHP, conocido por los scripts del lado del servidor, se beneficia enormemente de la OOP. Esto se debe a que la OOP admite código modular y reutilizable, lo que facilita su mantenimiento. A su vez, esto facilita una mejor organización y escalabilidad de los grandes proyectos.

Dominar la OOP es importante para los desarrolladores que trabajan con temas, plugins y soluciones personalizadas de WordPress. En este artículo, explicaremos qué es la programación orientada a objetos en PHP y el impacto que tiene en el desarrollo de WordPress. También te explicaremos cómo aplicar los principios de la programación orientada a objetos en PHP.

Requisitos previos

Para seguir las partes prácticas de este artículo, asegúrate de tener:

Ventajas de OOP en el desarrollo PHP

La programación orientada a objetos impulsa significativamente el desarrollo de PHP al mejorar la modularidad, la reutilización, la escalabilidad, la capacidad de mantenimiento y el trabajo en equipo. Organiza el código PHP dividiéndolo en objetos, cada uno de los cuales representa una parte específica de la aplicación. Utilizando objetos, puedes reutilizar fácilmente el código, ahorrando tiempo y reduciendo los errores.

Con esto en mente, vamos a sumergirnos en dos ventajas específicas de la OOP en PHP, destacando cómo transforma el proceso de desarrollo.

1. Reutilización y mantenimiento del código

La OOP en PHP facilita la reutilización del código gracias a la herencia y el polimorfismo. Las clases pueden utilizar propiedades y métodos de otras clases. Esto te permite utilizar código antiguo de formas nuevas con pocos cambios.

La OOP también facilita el cuidado de tu código. La encapsulación significa que los objetos mantienen sus detalles en privado y sólo comparten lo que es necesario, utilizando métodos especiales llamados getters y setters. Este enfoque ayuda a evitar que los cambios en una parte de tu aplicación causen problemas en otras, haciendo que el código sea más sencillo de actualizar y mantener.

Además, como los objetos se completan por sí solos, es más fácil encontrar y corregir errores en determinadas partes del sistema. Esto mejora la calidad y fiabilidad general del código.

2. Mayor claridad y estructura

La OOP hace que el código PHP sea más limpio y organizado mediante clases y objetos. Las clases actúan como plantillas para los objetos, manteniendo todo lo que debe estar junto en un solo lugar.

La OOP también permite que las clases utilicen características de otras clases, lo que significa que no tienes que escribir el mismo código repetidamente. Todo esto ayuda a que el código sea más limpio, más fácil de arreglar y esté mejor organizado.

El código claro de la OOP ayuda a los equipos a trabajar mejor juntos. Es más fácil para todos entender lo que hace el código, lo que significa menos tiempo explicando cosas y más tiempo haciendo el trabajo. También reduce los errores, ayudando a que el proyecto siga por buen camino. Y cuando el código está limpio y ordenado, los nuevos miembros del equipo pueden ponerse al día rápidamente.

Implementación de OOP en PHP

En OOP para PHP, organizas el código con clases y objetos, como los planos y las casas. Creas clases para todo (como usuarios o libros), incluyendo sus características y acciones. Luego, utilizas la herencia para construir nuevas clases a partir de las existentes, ahorrando tiempo al no repetir código. Y como la encapsulación mantiene privadas algunas partes de las clases, tu código es más seguro.

Los siguientes apartados te mostrarán cómo utilizar eficazmente los principios de la programación orientada a objetos (OOP) en tu programación PHP. Creamos un sistema de gestión de contenidos (CMS) para gestionar artículos.

1. Definir una clase con propiedades y métodos

Empieza con una clase Article que incluya propiedades de título, contenido y estado, junto con métodos para establecer y mostrar estas propiedades.

class Article {
    private $title;
    private $content;
    private $status;

    const STATUS_PUBLISHED = 'published';
    const STATUS_DRAFT = 'draft';

    public function __construct($title, $content) {
        $this->title = $title;
        $this->content = $content;
        $this->status = self::STATUS_DRAFT;
    }

    public function setTitle($title) {
        $this->title = $title;
        return $this;
    }

    public function setContent($content) {
        $this->content = $content;
        return $this;
    }

    public function setStatus($status) {
        $this->status = $status;
        return $this;
    }

    public function display() {
        echo "<h2>{$this->title}</h2><p>{$this->content}</p><strong>Status: {$this->status}</strong>";
    }
}

2. Crea objetos e implementa el encadenamiento de métodos

Crea un objeto artículo y utiliza el encadenamiento de métodos para establecer sus propiedades:

$article = new Article("OOP in PHP", "Object-Oriented Programming concepts.");
$article->setTitle("Advanced OOP in PHP")->setContent("Exploring advanced concepts in OOP.")->setStatus(Article::STATUS_PUBLISHED)->display();

3. Refuerza la encapsulación y la herencia

Refuerza la encapsulación utilizando métodos getter y setter y crea una clase FeaturedArticle que herede de Article:

class FeaturedArticle extends Article {
    private $highlightColor = '#FFFF00'; // Default highlight color

    public function setHighlightColor($color) {
        $this->highlightColor = $color;
        return $this;
    }

    public function display() {
        echo "<div> style='background-color: {$this->highlightColor};'>";
        parent::display();
        echo "</div>";
    }
}

$featuredArticle = new FeaturedArticle("Featured Article", "This is a featured article.");
$featuredArticle->setStatus(FeaturedArticle::STATUS_PUBLISHED)->setHighlightColor('#FFA07A')->display();

4. Interfaces y polimorfismo

Define una interfaz para el contenido publicable e impleméntala en la clase Article para demostrar el polimorfismo:

interface Publishable {
    public function publish();
}

class Article implements Publishable {
    // Existing class code...

    public function publish() {
        $this->setStatus(self::STATUS_PUBLISHED);
        echo "Article '{$this->title}' published.";
    }
}

function publishContent(Publishable $content) {
    $content->publish();
}

publishContent($article);

5. Utiliza traits para un comportamiento compartido

PHP te permite utilizar traits para añadir funciones a las clases sin necesidad de heredar de otra clase. Utilizando el siguiente código, introduce un trait para registrar actividades dentro del CMS:

trait Logger {
    public function log($message) {
        // Log message to a file or database
        echo "Log: $message";
    }
}

class Article {
    use Logger;

    // Existing class code...

    public function publish() {
        $this->setStatus(self::STATUS_PUBLISHED);
        $this->log("Article '{$this->title}' published.");
    }
}

OOP en el desarrollo de WordPress

Los principios de la programación orientada a objetos mejoran significativamente el desarrollo de WordPress, sobre todo al crear temas, plugins y widgets. Con la ayuda de la OOP, puedes escribir código más limpio, escalable y fácil de mantener para tus sitios de WordPress.

Esta sección repasa cómo aplicar OOP en el desarrollo de WordPress. Proporcionaremos ejemplos que puedes copiar y pegar en una despliegue de WordPress para probarlos.

OOP en los temas de WordPress: Registro de tipos de entrada personalizados

Para demostrar el uso de OOP en los temas de WordPress, crea una clase que gestione el registro de un tipo de entrada personalizado.

Coloca el siguiente código en el archivo functions.php de tu tema. Puedes encontrar tus temas en el directorio wp-content/themes.

class CustomPostTypeRegistrar {
    private $postType;
    private $args;

    public function __construct($postType, $args = []) {
        $this->postType = $postType;
        $this->args = $args;
        add_action('init', array($this, 'registerPostType'));
    }

    public function registerPostType() {
        register_post_type($this->postType, $this->args);
    }
}

// Usage
$bookArgs = [
    'public' => true,
    'label'  => 'Books',
    'supports' => ['title', 'editor', 'thumbnail'],
    'has_archive' => true,
];
new CustomPostTypeRegistrar('book', $bookArgs);

Este código registra dinámicamente un tipo de entrada personalizado book con sus detalles pasados a través del array bookArgs. Puedes ver el tipo de entrada personalizado recién creado en la barra lateral de administración de WordPress con la etiqueta Books (Libros).

Captura de pantalla de la página Libros en WordPress. En la parte superior de la página hay un botón Añadir nueva entrada
El elemento de la barra lateral del tipo de entrada personalizada Libros y el correspondiente Añadir nueva entrada Libros.

Este ejemplo ilustra cómo OOP puede encapsular la funcionalidad para registrar tipos de entrada personalizados, haciéndola reutilizable para distintos tipos de entradas.

OOP en los plugins de WordPress: Manejador de shortcodes

Para un ejemplo de plugin, desarrollas una clase que maneja un shortcode para mostrar un mensaje especial. Puedes probar esta función añadiendo el siguiente shortcode a cualquier entrada o página.

<?php
/**
* Plugin Name: OOP Shortcode Handler
* Description: Handles a custom shortcode with OOP.
* Version: 1.0
* Author: Name
*/

class OOPShortcodeHandler {
    public function __construct() {
        add_shortcode('oop_message', array($this, 'displayCustomMessage'));
    }

    public function displayCustomMessage($atts) {
        $attributes = shortcode_atts(['message' => 'Hello, this is your OOP     
message!'], $atts);
        return "<div>{$attributes['message']}</div>";
    }
}

new OOPShortcodeHandler();

Guárdalo como my-oop-shortcode-handler.php en el directorio wp-content/plugins. Por último, activa el plugin.

Captura de pantalla de la página Plugins. En la parte superior de la página hay un botón Añadir nuevo plugin. Debajo hay una lista de plugins. My OOP Shortcode Handler aparece en la lista y está activo
My OOP Shortcode Handler aparecerá en la página de plugins.

A continuación, en el editor de páginas o entradas, antes de publicar o actualizar, utiliza los shortcodes [oop_message] y [oop_message message="Custom Message Here"], como se muestra a continuación:

Captura de pantalla de la página de ejemplo. Muestra los fragmentos de código
La Página de Ejemplo en modo edición con el mensaje del shortcode personalizado añadido.
Tras publicar o actualizar la página/post, verás el mensaje que denotan los shortcodes mostrados.

Captura de pantalla de la página de ejemplo. Muestra dos mensajes:
La Página de Ejemplo publicada con el mensaje del shortcode personalizado mostrado.

OOP en los widgets de WordPress: widget de contenido dinámico

OOP también es beneficiosa para los widgets, ya que encapsula su funcionalidad dentro de clases. El propio core de WordPress utiliza OOP para los widgets. Aquí, creas un widget personalizado que permite a los usuarios mostrar contenido dinámico con un título y un área de texto.

Añade el siguiente código al archivo functions.php de tu tema o dentro de un plugin. Define un widget personalizado que muestre el mensaje «¡Hola mundo desde mi widget personalizado!»

class My_Custom_Widget extends WP_Widget {

    public function __construct() {
        parent::__construct(
            'my_custom_widget', // Base ID
            'My Custom Widget', // Name
            array('description' => __('A simple custom widget.', 
'text_domain'),) // Args
        );
    }

    public function widget($args, $instance) {
        echo $args['before_widget'];
        if (!empty($instance['title'])) {
            echo $args['before_title'] . apply_filters('widget_title',  
$instance['title']) . $args['after_title'];
        }
        // Widget content
        echo __('Hello World From My Custom Widget!', 'text_domain');
        echo $args['after_widget'];
    }

    public function form($instance) {
        // Form in WordPress admin
    }

    public function update($new_instance, $old_instance) {
        // Processes widget options to be saved
    }
}

function register_my_custom_widget() {
    register_widget('My_Custom_Widget');
}
add_action('widgets_init', 'register_my_custom_widget');

Mientras editas el tema activo utilizando el enlace Personalizar en Apariencia en el área Admin, puedes añadir un nuevo widget personalizado donde sea necesario.

Captura de pantalla de la página de inicio del sitio de WordPress. La parte izquierda de la página tiene un menú con las entradas recientes y los comentarios recientes, con un botón Activar y Publicar
La configuración del widget personalizado en la barra lateral y el uso del widget en una página de ejemplo.

Utilizar las clases de WordPress

WordPress proporciona varias clases que puedes utilizar para interactuar con la funcionalidad principal del CMS. Dos de estas clases son WP_User y WP_Post, que representan usuarios y entradas, respectivamente.

Ampliando el ejemplo anterior del plugin de WordPress, incorpora estas clases para crear un shortcode que muestre información sobre el autor de una entrada y detalles sobre la propia entrada.

Guárdalo como my-oop-shortcode-handler-extended.php en el directorio wp-content/plugins. Por último, activa el plugin.

<?php
/**
* Plugin Name: Extended OOP Shortcode Handler
* Description: Extends the shortcode handler to display post and author 
information.
* Version: 1.1
* Author: Your Name
*/

class ExtendedOOPShortcodeHandler {
    public function __construct() {
        add_shortcode('post_author_details', array($this,   
'displayPostAuthorDetails'));
    }

    public function displayPostAuthorDetails($atts) {
        global $post; // Accessing the global $post object to get current post  
details

        $attributes = shortcode_atts([
            'post_id' => $post->ID, // Default to the current post ID
        ], $atts);

        $postDetails = get_post($attributes['post_id']); // Getting the WP_Post  
object
        if (!$postDetails) {
            return "Post not found.";
        }

        $authorDetails = new WP_User($postDetails->post_author); // Getting the 
WP_User object

        $output = "<div class='post-author-details'>";
        $output .= "<h2>Author Information</h2>";
        $output .= "<p>Name: " . esc_html($authorDetails->display_name) . 
"</p>";
        $output .= "<h2>Post Information</h2>";
        $output .= "<p>Title: " . esc_html($postDetails->post_title) . "</p>";
        $output .= "<p>Content: " . 
esc_html(wp_trim_words($postDetails->post_content, 20, '...')) . "</p>";
        $output .= "</div>";

        return $output;
    }
}

new ExtendedOOPShortcodeHandler();

En esta versión extendida, has creado un shortcode: [post_author_details post_id="1"].

Captura de pantalla de la Página de Ejemplo. Se abre con el fragmento de código
La Página de ejemplo en modo edición con el mensaje del shortcode personalizado extendido añadido.
Cuando se añade a una entrada o página, muestra detalles sobre el autor de la entrada (utilizando la clase WP_User ) y la propia entrada (utilizando la clase WP_Post ).

OOP y la API REST de WordPress

La API REST de WordPress es un complemento moderno de WordPress que te permite interactuar con los datos del sitio de una forma más programable. Aprovecha ampliamente la OOP, utilizando clases para definir los endpoints, las respuestas y la gestión de las solicitudes. Esto representa un claro alejamiento de sus raíces en los procedimientos tradicionales para adoptar la programación orientada a objetos.

En claro contraste con los principios de la OOP, gran parte del core de WordPress, especialmente sus primeros componentes, como la API de temas y plugins, está escrito con un estilo de programación procedimental.

Por ejemplo, mientras que un enfoque procedimental podría manipular directamente variables globales y depender de una secuencia de funciones para las tareas, la OOP en la API REST encapsula la lógica dentro de clases. Por lo tanto, los métodos específicos dentro de estas clases manejan tareas como la obtención, creación, actualización o eliminación de entradas.

Esto separa claramente las preocupaciones y hace que el código base sea más fácil de ampliar y depurar.

A través de clases que definen endpoints y gestionan solicitudes, como la obtención de entradas con una solicitud GET /wp-json/wp/v2/posts, la API REST ofrece una forma estructurada y escalable de interactuar con los datos de WordPress, devolviendo respuestas con formato JSON.

Aprovechar Kinsta para el alojamiento de PHP y WordPress

Las soluciones de alojamiento de Kinsta ayudan a optimizar las aplicaciones PHP y a gestionar el alojamiento de WordPress, atendiendo a las configuraciones PHP tradicionales y a las necesidades específicas de WordPress. Con una infraestructura robusta construida sobre tecnologías de vanguardia como Google Cloud, Kinsta facilita un rendimiento y una escalabilidad sin igual para aplicaciones PHP basadas en OOP.

Para los sitios de WordPress, el servicio especializado de Alojamiento de WordPress de Kinsta ofrece funciones como actualizaciones automáticas, supervisión de la seguridad y soporte de expertos. Garantiza una gestión sin complicaciones y un rendimiento superior, por lo que es ideal tanto para desarrolladores como para empresas.

Resumen

Como has visto a lo largo de este artículo, OOP ofrece una flexibilidad, escalabilidad y facilidad de mantenimiento inigualables en el desarrollo de PHP y WordPress.

Como proveedor líder de alojamiento administrado de WordPress, Kinsta reconoce esta necesidad y ofrece soluciones a medida para apoyar a desarrolladores como tú en sus esfuerzos de OOP PHP. Por eso, nuestras soluciones de Alojamiento de Aplicaciones y WordPress están diseñadas para ayudarte a construir proyectos WordPress basados en OOP, escalables y de alto rendimiento.

¡Prueba Kinsta hoy mismo y descubre cómo podemos ayudarte a crear sitios WordPress de primer nivel!

¿Has experimentado las ventajas OOP en tus proyectos? ¿O tienes curiosidad por saber cómo puede transformar tu proceso de desarrollo? Compártelo en los comentarios.

Jeremy Holcombe Kinsta

Editor de Contenidos y Marketing en Kinsta, Desarrollador Web de WordPress y Redactor de Contenidos. Aparte de todo lo relacionado con WordPress, me gusta la playa, el golf y el cine. También tengo problemas con la gente alta ;).