En PHP 8, promoción de propiedad de constructor

La promoción de propiedades de constructor es una nueva característica de conveniencia de PHP 8 que le ayuda a minimizar la repetición de código. Le permite combinar la definición y la inicialización de propiedades en una sola declaración del constructor. En el contexto de los objetos de valor, la promoción de la propiedad del constructor (CPP en adelante) es más útil.

Suelen ser clases simples que describen la estructura de un dato. Así es como se vería uno en PHP 7.

4: ¡A pesar de tener solo tres propiedades, hemos creado una clase razonablemente larga! Cada nombre de la propiedad aparece cuatro veces, con dos tipos escritos dos veces. Tocaría tres líneas de código si necesitara modificar una de las propiedades o agregar otra. Aquí está el mismo ejemplo, reescrito en PHP 8 para usar CPP: Hemos reducido drásticamente el tamaño de nuestra clase usando CPP. Solo necesita agregar o modificar una línea de código cuando trabaje con las propiedades de esta clase.

CPP combina la definición de propiedades con la lista de parámetros del constructor. Prefije su nombre con un modificador de visibilidad de clase, público, protegido o privado, para crear una propiedad promocionada. Una vez promovida, la propiedad actúa como cualquier otra propiedad de una clase.

Una clase convencional

Dentro de la clase, puede acceder a ella usando $ this -> Propiedad o externamente (si es una propiedad pública). Internamente, PHP simplemente convierte la sintaxis compacta en la versión mucho más larga soportada por PHP 7.

Por ejemplo, no tiene que usar sugerencias con propiedades promocionadas; es aceptable escribir $ Título protegido. Utilice la misma sintaxis que un parámetro de constructor normal para establecer valores predeterminados (cadena protegida $ Título = ‘Publicación de ejemplo’).

Su constructor no siempre será tan simple como nuestro ejemplo. Es posible que necesite realizar algunas comprobaciones de validación o una transformación de valor. Al usar CPP, aún puede escribir un cuerpo de constructor.

Adición de promoción de propiedad de constructor

Puede utilizar la variable de instancia promocionada o la variable local para acceder a los valores de sus propiedades promocionadas: sea cual sea el enfoque que elija, la variable o la propiedad, trabajará con el mismo valor. PHP simplemente oculta la línea $ this -> Title = $ Title que normalmente escribiría manualmente.

Con las definiciones de propiedad regulares, puede mezclar libremente propiedades promocionadas. Además, en los parámetros de su constructor, puede combinar propiedades promocionadas y no promocionadas.

Al mezclar la sintaxis, debe tener cuidado. Las propiedades promocionadas, especialmente si están precedidas por definiciones de propiedades de clase normales, pueden pasarse por alto fácilmente al hojear el código. Si su clase ya tiene varias propiedades usando la forma tradicional, puede que no sea el mejor enfoque para ese archivo usar la nueva sintaxis para una adición adicional.

Una mirada más de cerca

Una de las otras características nuevas de PHP 8 son los atributos. Estos permiten que se anoten metadatos adicionales en las entidades de su código base. Las propiedades promocionadas están totalmente respaldadas por atributos.

Dado que es ambiguo si el atributo se aplica a la definición de una propiedad o al parámetro de un método, PHP lo aplicará a ambos. Ya sea que esté verificando la propiedad o el parámetro del constructor, eso significa que obtendrá el mismo valor. Este enfoque flexible garantiza que al adoptar la promoción de propiedades de constructor, no pierda ninguna funcionalidad de atributo.

Las propiedades promocionadas y los argumentos del constructor que promueven una propiedad, cuando se introspectan a través de las API de Reflection, actúan de forma intuitiva. En su estado posterior a la transpilación, la reflexión mira las propiedades promocionadas, por lo que parecen idénticas a una propiedad declarada explícitamente.

Usando el cuerpo de una constructora

Para comprobar si estaban involucrados con CPP, las clases ReflectionProperty y ReflectionParameter tienen nuevos métodos isPromoted (). Sin embargo, esto generalmente no debería ser considerado, a menos que escriba una herramienta que quiera replicar la estructura de origen exacta.

No puede declarar nombres de propiedades y clases duplicados que se promocionan. Un error en tiempo de ejecución resultaría en el siguiente ejemplo: Esto se debe a que PHP realmente no hace nada especial con las definiciones de propiedades promocionadas. Su conciso código fuente simplemente se transpone al estilo PHP 7.

4. Esto daría como resultado dos líneas de la cadena pública $ Title, que siempre ha estado prohibida.

Hay otros casos en los que podría producirse un error de CPP. Las propiedades promocionadas, aunque pueden usarse en rasgos, están prohibidas en clases abstractas.

Con ellos, no puede utilizar el tipo invocable porque no es compatible con las definiciones de propiedad. Finalmente, debido a que la propiedad terminaría siendo una matriz de instancias de cadena, no una cadena en sí misma, no hay soporte para parámetros variables (por ejemplo, cadena pública .

.

. $ cadenas). La promoción de las propiedades de los constructores hace que sea mucho más rápido escribir nuevos objetos de valor en su código base. ¡Puede cortar hasta dos tercios del número de líneas! CPP también le permite SECAR (No se repita) su código al evitar la repetición antiestética del tipo y los nombres de propiedad requeridos por PHP 7.4. La adopción de CPP es opcional para las clases existentes y no siempre tendrá sentido.