Voy a intentar algo con el formato de esta pregunta y estoy abierto a sugerencias sobre una mejor manera de manejarlo.¿Es esta una forma razonable de manejar getters/setters en una clase de PHP?
No quería solo descargar un montón de código en la pregunta, así que he publicado el código de la clase en refactormycode.
base class for easy class property handling
Mi pensamiento era que la gente puede o fragmentos de correos código aquí o hacer cambios en refactormycode y colocar enlaces a sus refactorizaciones. Formularé votaciones y aceptaré una respuesta (suponiendo que haya un "ganador" claro) en función de eso.
En cualquier caso, a la propia clase:
veo un gran debate acerca de los métodos de la clase de captador/definidor y es mejor acceder simplemente variables de las propiedades simples directa o debería todas las clases tienen explícita get/set métodos definidos, bla, bla, bla. Me gusta la idea de tener métodos explícitos en caso de que tenga que agregar más lógica más adelante. Entonces no tienes que modificar ningún código que use la clase. Sin embargo, me gusta tener un millón de funciones que se ven así:
public function getFirstName()
{
return $this->firstName;
}
public function setFirstName($firstName)
{
return $this->firstName;
}
Ahora estoy seguro de que no soy la primera persona para hacer esto (estoy esperando que hay una mejor forma de hacerlo que alguien pueda sugerir a mí).
Básicamente, la clase PropertyHandler tiene un __call método mágico. Todos los métodos que vienen a través de __call que comienzan con "get" o "set" se enrutan a funciones que establecen o recuperan valores en una matriz asociativa. La clave en la matriz es el nombre del método de llamada después de obtener o establecer. Por lo tanto, si el método que entra en __call es "getFirstName", la clave del arreglo es "FirstName".
Me gustó usar __call porque se ocupará automáticamente del caso en que la subclase ya tenga definido un método "getFirstName". Mi impresión (y puedo estar equivocado) es que los __get & __conjuntos mágicos no hacen eso.
Así que aquí es un ejemplo de cómo funcionaría:
class PropTest extends PropertyHandler
{
public function __construct()
{
parent::__construct();
}
}
$props = new PropTest();
$props->setFirstName("Mark");
echo $props->getFirstName();
en cuenta que PropTest no tiene realmente métodos "getFirstName" "setFirstName" o PropertyHandler y tampoco lo hace. Todo lo que hace es manipular valores de matriz.
El otro caso sería donde su subclase ya está extendiendo algo más. Como no puede tener una herencia múltiple verdadera en PHP, puede hacer que su subclase tenga una instancia de PropertyHandler como una variable privada. Tienes que agregar una función más, pero luego las cosas se comportan exactamente de la misma manera.
class PropTest2
{
private $props;
public function __construct()
{
$this->props = new PropertyHandler();
}
public function __call($method, $arguments)
{
return $this->props->__call($method, $arguments);
}
}
$props2 = new PropTest2();
$props2->setFirstName('Mark');
echo $props2->getFirstName();
Observe cómo la subclase tiene un método __call que simplemente pasa a lo largo de todo el método __call PropertyHandler.
Otro buen argumento contra el manejo de getters y setters de esta manera es que hace que sea muy difícil de documentar.
De hecho, es básicamente imposible utilizar cualquier tipo de herramienta de generación de documentos ya que los métodos explícitos que se deben documentar no existen.
Por el momento, he abandonado este enfoque. Fue un ejercicio de aprendizaje interesante, pero creo que sacrifica demasiada claridad.
Por curiosidad, ¿qué método usas ahora? – SeanJA
Tener getters ** y ** setters en la misma clase es un signo de que a la clase le falta su código. Investigue el código que usa los getters y setters de la clase y muévalo dentro de la clase porque aquí es donde pertenece. – axiac