Getters y Setters parecen una forma realmente larga de lidiar con los valores asignados a las propiedades en los objetos. Lo más probable es que esté acostumbrado a simplemente asignar valores a sus variables dentro de su código de procedimiento sin problemas. Entonces, ¿por qué ponerse tan sofisticado en PHP orientado a objetos y comenzar a lidiar con formas más complicadas de asignar y acceder a los datos que contienen las propiedades de nuestros objetos? ¿Cuál es el punto de? Bueno, hay buenas razones para esto, y trataremos de entenderlas en este tutorial.

Comencemos creando una clase usando nuestro enfoque de búsqueda de sustantivos¿Qué tal una motocicleta, suena divertido, verdad? Seguro.

Suponiendo que tengamos una motocicleta, esta vendrá de un fabricante. De hecho, cada motocicleta tiene un fabricante, así que configuremos una forma de asegurarnos de que nuestros objetos de motocicleta tengan un fabricante desde el principio. Podemos usar nuestra práctica función de constructor mágico para permitir eso.

Este código de arriba aquí representa el día en que convenció a su esposa para que le permitiera comprar una Harley Davidson nueva. Frio. Ahora que eres el manitas que eres, te imaginas que quieres poder personalizar tu nueva Harley. Tal vez tenga una obsesión con los neumáticos y desee la posibilidad de cambiarlos fácilmente según las condiciones meteorológicas. Suena genial, agreguemos esa habilidad ahora.

¡Increíble! Eso fue bastante fácil. ¿Qué pasa si decide cambiar sus neumáticos Dunlop por un juego de neumáticos Pirelli porque escuchó que son mejores en el verano? Eso es fácil de actualizar.

Ahora puede estar pensando: “Ambos estamos asignando y recuperando valores de nuestra propiedad, y ni siquiera hemos hablado de estos captores y establecedores tontos. ¿Lo que da?" En realidad, ese es un pensamiento válido. Sin embargo, hay una buena razón para ellos, y la exploraremos ahora.

Aumente la seguridad con Getters y Setters

Imaginemos que vas a una carrera con tu nueva Harley. La competencia es feroz y los corredores quieren cada ventaja que puedan encontrar para ganar. De los muchos corredores presentes, el clasificado más lento fue con neumáticos Cooper. Tú, por otro lado, fuiste el clasificado más rápido en un nuevo conjunto de Dunlops. RacerX decide que va a sabotear tus esfuerzos y cambiar sus Coopers por tu Harley, mientras roba tus Dunlops y los pone en su Bultaco. No hay nada que te proteja de eso. Veamos.

Auge. Así, pasas de héroe a cero en la pista. Necesitamos una forma de evitar que RacerX vuelva a manipular su máquina.

Presentamos Getters y Setters

Podemos hacer precisamente eso implementando un método especial llamado setter, y RacerX va a intentar abusar de ese setter, pero lo sabemos mejor.

En este punto, RacerX intentará utilizar nuestro nuevo método setTirespara instalar maliciosamente un juego de neumáticos Cooper de bajo rendimiento en nuestra Harley lista para la carrera. Sin embargo, tome nota de la lógica que colocamos dentro de nuestro métodoAntes de asignar la propiedad de los neumáticos, verificamos rápidamente su valor. Establecimos una regla tal que si los neumáticos son Cooper, lanzaremos una excepción y no permitiremos que se instalen esos neumáticos. Resulta que esta es la única forma en que podemos implementar este tipo de seguridad o comportamiento al acto de establecer un valor a nuestra propiedad. Cuando trabajamos con propiedades directamente, no hay forma de engancharnos a este comportamiento, razón por la cual los getters y setters son algo bueno.

Ya que hemos mostrado cómo usar un setter, también repasemos cómo usar un getter. Es bastante fácil, simplemente lo hacemos así:

Todavía no hemos agregado ningún comportamiento a nuestro método getter. Parecería que no habría razón para hacerlo, ya que todo lo que estamos haciendo es devolver un valor, pero si lo piensa, tal vez desee aplicar algún tipo de formato a sus datos. En este caso, imaginemos que la agencia sancionadora quiere revisar los neumáticos de todos los corredores, y solo aceptan la marca del neumático en todas las letras mayúsculas. Podemos implementar eso con nuestro getter así.

Simplemente envolvemos nuestra declaración de devolución con una llamada al strtouppery estamos en el negocio.

Nota: Es una convención común usar camel case para los métodos getter y setter. Eso significa que la parte get o set del nombre del método está en minúsculas, seguida de la propiedad que estamos obteniendo o configurando con la primera letra en mayúscula. Al utilizar este enfoque, los consumidores de nuestra clase se ven obligados a seguir la lógica que establecemos en nuestros ganchos. Además de este enfoque, PHP también tiene una forma incorporada de lidiar con getters y setters a través del método mágico, funciones especiales__get()y__set().

El problema de las propiedades públicas

Una cosa que no mencionamos todavía es que la propiedad de nuestros neumáticos sigue siendo pública. Creamos una verificación de datos bastante hábil e integridad en nuestros captadores y definidores, pero adivinen qué, si nuestro competidor malintencionado quiere continuar abusando de la propiedad de nuestros neumáticos a través de la sintaxis como en $motorcycle->tires = 'Cooper'lugar de $motorcycle->setTires('Cooper'), podría hacerlo. La razón por la que puede hacerlo es porque nuestra propiedad de neumáticos sigue siendo pública. Necesitamos una forma de obligar a los usuarios de nuestra clase a usar solo nuestros getters y setters, y evitar que intenten jugar con las cosas directamente. Podemos hacer esto con la encapsulación, de la que hablaremos más pronto.

Resumen de getters y setters

Getters y Setters juegan un papel importante en la programación orientada a objetos. Nos permiten implementar comportamientos y enlaces a los valores que se pueden almacenar en las propiedades de nuestros objetos. Esto proporciona una buena forma de aumentar la seguridad y evitar la manipulación malintencionada de nuestro código.