Blog sobre desarrollo WordPress en Español Desarrollo WordPress en Español
php

Named constructors en PHP

Como sabrás, cuando desarrollas sobre PHP y creas una clase, esta permite tener, entre otras cosas, constructores. Un constructor te permite por ejemplo inicializar propiedades al instanciar el objeto antes de ser utilizado.

Esto es muy útil, pero a veces las necesidades de negocio nos hacen desarrollar cosas inapropiadas en el __construct(), como añadir lógica que no debería ir allí.

Aunque los named constructors pueden ser utilizados simplemente para que el código sea más legible.

¿En qué consisten? Básicamente en instanciar un objeto a través de uno o varios métodos estáticos. Estos métodos estáticos tendrán la lógica necesaria y acabarán instanciando el objeto. De este modo, evitamos esa lógica en el constructor, y el código quedará más legible y semántico. Para evitar instanciar un objeto con new, declararemos el __construct() privado.

Como todo esto se ve mejor con un ejemplo, imaginemos que nos piden una clase que tiene que devolvernos la latitud y la longitud según unos datos de entrada y pintarlos en un mapa. Estos datos de entrada pueden ser variopintos: podrían ser coordenadas directamente, podrían ser una dirección, un registro en base de datos… con estos 3 ejemplos es suficiente.

¿Cuál es el problema? Que la clase recibe una información de tres maneras diferentes:

  • Coordenadas: Dos valores numéricos
  • Dirección: Una cadena de texto con el nombre de la calle, población, provincia, etc…
  • Base de datos: Un registro de una ubicación que tengamos almacenada en nuestra base de datos
 

Vamos a obviar en el ejemplo toda la lógica necesaria para hacer los cálculos y las consultas pertinentes para obtener las coordenadas, simplemente vamos a ver cómo podríamos tener 3 named constructors en una clase con estas necesidades de negocio.

Como podemos observar, hemos creado 3 named constructors. Los 3 devolverán una instancia de sí mismos (self) y el constructor privado seteará las propiedades latitud y longitud de este objeto.

  • PrintMarker::fromCoordinates – Recibirá directamente unas coordenadas.
  • PrintMarker::fromAddress – Recibirá una dirección y, por ejemplo, podríamos hacer una petición a la API de Google Maps y obtener la latitud y longitud de una dirección dada.
  • PrintMarker::fromDatabase – Realizaremos una consulta a nuestra base de datos y buscaremos, por ejemplo, un cliente sobre el que tendremos almacenados sus coordenadas o su dirección (sobre la cual podremos hacer una petición a una API como en el ejemplo anterior)
 

De este modo evitamos lógica en el constructor de la clase y cada vez que necesitemos instanciar un objeto para pintar unas coordenadas en un mapa, el código será más semántico ya que en su uso nos da información sobre de dónde vienen los datos.

Puede que también te interese

Shortcodes: ¿Qué son y cómo crearlos?
Shortcodes: ¿Qué son y cómo crearlos?
Los shortcodes de WordPress son pequeños códigos que puedes añadir al editor de texto WYSIWYG (también a widgets o directamente en el código fuente). Se…
Añade el código de Google Analytics a tus páginas AMP en WordPress
Añade el código de Google Analytics a tus páginas AMP en WordPress
Las páginas AMP cada día adquieren mayor importancia por su relevancia en los resultados de búsqueda en dispositivos móviles. Hace unos meses escribí un post…
Creando el .htaccess perfecto para WordPress
Creando el .htaccess perfecto para WordPress
El fichero .htaccess es un archivo de configuración de Apache. Nos permite establecer reglas en un directorio, por ejemplo, WordPress lo usa para crear una…
Cómo cargar CSS y JS sólo cuando el shortcode se esté utilizando
Cómo cargar CSS y JS sólo cuando el shortcode se esté utilizando
Es muy habitual que a la hora de desarrollar un shortcode (por ejemplo desde un plugin), que necesites darle unos estilos o que ejecute alguna…