PHP: Getters y Setters.
Uno de los objetivos más importantes de la Programación Orientada a Objetos, proteger y ocultar información, se le denomina encapsulamiento.
El encapsulamiento de datos previene que el desarrollador haga cambios inesperados al sistema, como también ocultar la información para que no pueda ser modificada o vista por otras clases y esto es muy útil pero además fácil de hacer.
Pero para poder acceder de forma segura a variables o propiedades de una clase debemos utilizar unos métodos específicos:
«Getters» y «Setters» son métodos de objeto que le permiten controlar el acceso a ciertas variables / propiedades de clase. A veces, estas funciones se denominan «métodos mutantes».
- Getter: Su función es permitir el obtener el valor de una propiedad de la clase y así poder utilizar dicho valor en diferentes métodos.
- Setter: Permite brindar acceso a propiedades especificas para poder asignar un valor fuera de la clase.
Echemos un vistazo a la siguiente clase de PHP :
<?php class Persona{ //Nombre de la persona private $name; //Fecha nacimiento de la persona. private $dateOfBirth; //SET del nombre de la persona. public function setName($name){ $this->name = $name; } //SET de la fecha de nacimiento. public function setDateOfBirth($dateOfBirth){ $this->dateOfBirth = $dateOfBirth; } //GET del nombre de la persona. public function getName(){ return $this->name; } //GET de la fecha de nacimiento. public function getDateOfBirth(){ return $this->dateOfBirth; } }
En nuestra clase de Persona anterior, tenemos dos propiedades privadas llamadas $name y $dateOfBirth. Debido a que son propiedades privadas, no podrá acceder a ellas de esta manera
Error fatal: no se puede acceder a la propiedad privada Persona :: $nombre
Para proporcionar acceso a nuestras propiedades privadas, hemos creado dos «captadores» llamados getName y getDateOfBirth . Si echa un vistazo a la clase de persona anterior, verá que estas funciones simplemente devuelven los valores de nuestras dos propiedades privadas. Eso es todo lo que hacen.
Debido a que la visibilidad de estas dos propiedades está configurada como privada, tampoco podrá modificar o «configurar» sus valores. En su lugar, tendrá que usar una de las funciones » setter» que creamos: setName o setDateOfBirth .
//Instantiate the Person object. $person = new Person ( ) ; //Set the name to "Wayne" $person -> setName ( 'Wayne' ) ; //Get the person's name. $name = $person -> getName ( ) ; //Print it out echo $name ;
En el código PHP anterior, nosotros:
- Instanciamos nuestro objeto Persona.
- «Establecemos» la propiedad $name en «Wayne» utilizando nuestro método setter setName .
- Luego recuperamos el valor de la propiedad $name usando nuestra función getter getName .
¿Por qué usar getters y setters? ¿Cual es el punto?
Los captadores y establecedores que creamos en nuestra clase de Persona anterior no tienen sentido, ya que simplemente proporcionan acceso a nuestras propiedades privadas. Más allá de eso, no hacen nada.
Sin embargo, ¿qué sucede si quisiéramos agregar una capa de validación para evitar que nuestro objeto sea mal utilizado? Por ejemplo, ¿qué sucede si quisiéramos asegurarnos de que la variable $name de la persona sea una variable de cadena y no otra cosa?
Bueno, simplemente podemos agregar esa capa de validación a nuestro método setter:
//Set the person's name. public function setName ( $name ) { if ( ! is_string ( $name ) ) { throw new Exception ( '$name must be a string!' ) ; } $this -> name = $name ; }
En el código PHP anterior, modificamos el método setter setName para que valide la variable $name.
Ahora, si un programador intenta establecer la variable $name en una matriz o un valor booleano, nuestra función generará una Excepción . Si quisiéramos, también podríamos asegurarnos de que la variable $name no sea una cadena en blanco.