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

Shortcuts o atajos del teclado en el editor de WordPress
Shortcuts o atajos del teclado en el editor de WordPress
El editor WYSIWYG (What You See Is What You Get – lo que ves es lo que obtienes) de WordPress te permite usar Shortcuts o…
De Font Awesome a SVG para mejorar el WPO
De Font Awesome a SVG para mejorar el WPO
Siempre me ha gustado Font Awesome, es una librería variada y versátil con la que puedes añadir iconos a botones sociales, campos de formularios, etiquetas,…
Cómo solucionar el error 404 en WordPress
Cómo solucionar el error 404 en WordPress
El error 404 o de página no encontrada es uno de los errores más comunes, no sólo en WordPress. Puede darse por multitud de razones,…
Cómo solucionar cuando haces cambios y nada ocurre en WordPress
Cómo solucionar cuando haces cambios y nada ocurre en WordPress
En alguna ocasión puede ocurrir que hagas un cambio en tu web tipo: Editar y/o crear una página o entrada. Editar un contenido. Añadir y/o…