sintaxis instrucciones funciones etiquetas comandos basicas php get set encapsulation accessor

instrucciones - Las funciones_get &_set de PHP o únicas para obtener y configurar para cada variable?



sintaxis php (3)

Aquí es cómo manejo este problema.

final public function __set($key, $value) { $method = ''set'' . ucfirst($key); if (method_exists($this, $method)) { $this->data[$key] = $this->$method($value); } else { $this->data[$key] = $value; } } final public function __get($key) { $method = ''get'' . ucfirst($key); if (method_exists($this, $method)) { return $this->$method($this->data[$key]); } else { return $this->data[$key]; } }

Si tiene un controlador personalizado para una propiedad, se llama (suponiendo que se llame getProperty). De lo contrario, se utiliza el método mágico get / set predeterminado.

PHP tiene incorporadas las funciones _get y _set. ¿Es mejor escribir mis propias funciones get y set para cada variable o usar las funciones integradas con un montón de if else si? ¿Cuáles son los pros y los contras de cada método?


Tiendo a seguir la regla de que si tienes una lógica de obtención o configuración compleja, agrega un método de obtención o configuración por separado. Si está haciendo algo simple, puede aprovechar __get o __set cuando de lo contrario se repetiría en muchos métodos de obtención / configuración personalizados.


__get y __set son métodos mágicos que normalmente se deben usar para resolver problemas difíciles en lugar de utilizarlos como base de diseño.

Por ejemplo, me encontré en un proyecto en el que tuve que analizar un sitio que usaba OOP con herencia profunda (> 2) y una de las clases base importantes tenía una propiedad pública llamada name . Sin embargo, también tenía getters y setters ( getName , setName ) que accedían a esa propiedad con el solo propósito de obtenerla y configurarla. Muchas clases llamadas getName y ¡tantas como acceso a la propiedad del name directamente! No es un gran diseño.

Los métodos mágicos me permitieron resolver el problema cambiando el nombre de la propiedad a _name y haciéndolo privado, forzando todas las solicitudes a la propiedad a través de getters y setters.

Dicho esto, no hay necesidad de getters y setters si solo está tratando una propiedad como una variable. En ese caso, solo haga que la propiedad sea pública.

En su caso, dado que hay una validación / desinfección en marcha, debe emplear getters y setters y codificarlos directamente como métodos (en lugar de incurrir innecesariamente en la sobrecarga de los métodos mágicos).