En PHP orientado al objeto, la herencia es la capacidad de crear una clase que extienda otra clase y se haga cargo de algunas o todas sus características. Esta es una de las funciones más útiles del programa orientado en PHP (OOP PHP). Lo leí en algunos de mis artículos recientes sobre caca en PHP, pero en este artículo, quiero echar un vistazo más profundo a la herencia de clase, cómo usarlo y por qué es importante. La primera vez que la herencia, cuando intenté escribir un complemento de WordPress muy grande, tenía cuatro clases principales que trataban con cuatro tipos diferentes de publicaciones. Estas cuatro clases tenían algunas diferencias, pero tenían varias similitudes creadas al escribirlas en una clase y luego copiarlo y pegarlo en los otros dos.
Aunque parecía funcionar en ese momento, me di cuenta de que cometí algunos errores que fueron literalmente copiados y pegados a cuatro lugares diferentes. Para resolver los problemas, tuve que cambiar cuatro veces. Y, si se necesitaría un cambio futuro, requeriría un cambio de cuatro puntos. Eso fue malo cuantificable. Para mi suerte, acababa de leer los artículos de Carl Alexander sobre la herencia y los cursos abstractos, que mostraron cómo se hizo correctamente. Este artículo ofrece una introducción básica en la herencia de la clase en PHP orientado a objetos, que lo equipará para escribir un código mejor y más reutilizable y puede personalizar el código de otras personas de manera más eficiente.
Cuando un complemento o biblioteca le brinda una clase casi perfecta, en lugar de copiarlo y cambiar un método, puede expandir esa clase y reemplazar el método. Cuando tiene dos clases que son casi idénticas, puede escribir una clase básica y luego puede extenderla dos veces. Extensión de las clases y anular una clase extiende otra utilizando la palabra clave “se extiende” en su declaración. Si nos gustaría expandir WP_Query, comenzamos la clase con “Product_Query expande WP_Query”. Cualquier clase se puede extender si no se declara con la palabra clave final. Cuando se extiende una clase, consideramos la clase principal, y la clase de extensión es subclase. El uso correcto de la herencia de la clase requiere una fuerte comprensión de la propiedad y la visibilidad del método, que traté en detalle aquí. Por ejemplo, si acabamos de escribir esto para nuestra clase Product_Query, sería lo mismo que WP_QUEY: Product_Query extiende WP_Query {} Por supuesto, eso no hace nada. Por otro lado, si trabajamos en un proyecto que necesitaba muchas consultas para publicar publicaciones de tipo, podríamos simplificar las cosas con esta clase: la clase Product_Quey extiende WP_Query {
Función pública __construct ($ query) {
$ Query [‘post_type’] = ‘producto’;
Padre :: __ construct ($ consulta);
}
} Esta clase sigue las mismas reglas de WP_Query, pero no debemos decir que solo queremos publicaciones de productos. También está claro que los objetos creados con él son para publicaciones de productos. Podríamos agregar más personalización en la construcción.
Tenga en cuenta que en mi clase extendida, he realizado una función llamada __construct () y que WP_QUEY también declara un constructor. Cualquier método mágico o no puede sobrescribirse en una subclase, pero puede continuar accediendo al método de clase principal utilizando la palabra clave “padre”. Tenga en cuenta que, en PHP5, sobrescribir un método y cambiar su firma, modificando los parámetros o sus tipos, activará una notificación estricta de los estándares, y en PHP7 activará una advertencia. No debe hacer esto porque hace que el código sea más difícil de leer. Si está utilizando las declaraciones de tipo devueltas a PHP7, no cambie el tipo de retorno de un método cuando lo anule en una subclase o se producirá un error fatal. PHP5 no acepta la declaración del tipo de retorno. Un buen ejemplo de herencia de clase son las clases wp_http_esponse, que se encuentran en el directorio WP-Includes/REST-API, pero podrían usarse para cualquier tipo de respuesta HTTP. Se extiende por la clase wp_rest_esponse, que se usa especialmente al responder a las solicitudes de API REST. Clases abstractas a menos que se declare una clase final, se puede extender. PHP proporciona una convención abstracta para clases que no pueden instanciarse directamente y actúa solo para proporcionar clases básicas para otras clases que las extienden. La otra regla especial de una clase abstracta es que pueden tener métodos abstractos, que deben ser reemplazados por la clase que los extiende, de lo contrario ocurrirá un error. Este es un sistema realmente útil, porque le permite definir cómo funcionarán las subclases.
Los métodos abstractos no pueden tener un cuerpo, y los métodos que los exceden no deben cambiar su firma. Si intenta cambiar los parámetros o tipos de parámetros en PHP5 o PHP7, se producirá un error fatal. Esto es ligeramente diferente de sobrescribir métodos no abstractos, aunque en la práctica es lo mismo, porque nunca debe cambiar la firma de un método, incluso si puede técnicamente con los estándares estrictamente desactivados. Las interfaces ofrecen un papel similar, pero los métodos de una interfaz deben ser públicos, mientras que los métodos abstractos pueden ser públicos, protegidos o privados. Métodos que los métodos abstractos de sobrecarga también deben usar la misma firma. Se extiende por todos los puntos finales para proporcionar un sistema estándar de cómo deberían funcionar las clases de puntos finales. Tenga en cuenta que no usan métodos abstractos, porque los métodos abstractos no se aceptan en versiones anteriores. En cambio, la clase básica tiene métodos que llaman __doing_it_wong (). Esta es una solución para forzar la extensión de estos métodos. Para otro ejemplo, consideremos un complemento que se conecta a las redes sociales a través de OAuth y luego almacena claves públicas y secretas para su uso posterior. Debido a que la toma efectiva de las claves será diferente, necesitamos un código diferente para esto, pero ese código se puede reutilizar para almacenar y obtener las llaves. Por lo tanto, podríamos escribir un método abstracto llamado “conexión” que se ocupe de cualquier cosa, excepto las claves, que sucederían en un método abstracto.
clase social abstracta {

protegido $ público; protegido $ secreto;
Función pública __construct ($ public, $ secret) {
$ this-> public = $ public;
$ this-> secret = $ secret;
}
Abstract Connect () función pública;
Función pública get_public () {
devuelve $ this-> público;
}
Función pública get_sect () {
devolver $ this-> secret;
}
} Esto reduce la redundancia del código e impone un determinado modelo en el código, en el que todas las clases que extienden esta clase tienen el mismo método para obtener las claves y podrían llamar de manera segura ese método de cada subclase.
Por ejemplo, podríamos hacer una clase llamada “Twitter” y una llamada “Facebook” que extiende estas clases. Ambos solo necesitarían un método llamado Connect. Con el método Connect en su lugar, podemos asumir nuestra existencia y usar dos clases o más para hacer lo mismo, de la siguiente manera: la clase de Facebook se expande {
Connect () función pública {
// hacer algunas cosas para obtener claves de secreto público y establecer las propiedades correctas
}
}
La clase de Twitter se expande social {
Connect () función pública {
// hacer algunas cosas para obtener claves de secreto público y establecer las propiedades correctas
}
}
Foreach ([‘twitter’, ‘facebook’] como $ social_network) {
/** @Var Social $ obj*/
$ Obj = nueva red $ sosocial;
$ Obj-> conexión ();
update_option (‘public_’. $ social_network, $ obj-> get_public ());
update_option (‘Secret_’. $ Social_network, $ obj-> get_secret ());
} Menos código, mejor código Esta breve introducción en la herencia de las clases en PHP debería ayudarlo a escribir clases más pequeñas con un código más reutilizable. El código reutilizable no solo es más eficiente, es más fácil de leer, más fácil de mantener y requiere menos pruebas unitarias. Hay más usos para la herencia de la clase, que realmente debe intentar explorar. En lugar de reutilizar WP_QUEY una y otra vez, puede escribir una clase básica que llame a WP_Query y luego extenderla varias veces para satisfacer sus necesidades. Ejemplo, puede expandir la clase WP_REST_Controller, lo que le ahorrará mucho trabajo. Si trabaja en un sitio que interactúa con más servicios de correo electrónico transaccionales, escriba una clase básica que se ocupe de la funcionalidad común que todas las interacciones con las API de esos servicios de correo electrónico de transacción lo necesitan en el servicio. Podría continuar con ejemplos, pero debe mirar su código existente y planes de proyecto y pensar en cómo la herencia de clase puede ayudarlo a omitir el método de copia/vinculación y mejorar su código.
Introducción a la herencia de clase en PHP orientado a PHP
Tags Introducción a la herencia de clase en PHP orientado a PHP
homefinance blog