Últimamente me estoy poniendo en serio con POO en PHP5 —hasta hace poco casi todo el código en mis aplicaciones era PHP5 al estilo de PHP4, y quiero que eso cambie—, y hoy me ha surgido una duda: ¿Cual es la forma óptima de inicializar una propiedad pública, pero filtrada, de un objeto?
Es decir, yo tengo este código:
Código PHP:
class Prueba{
private $a; //Debe ser una cadena, por ejemplo.
public function __construct($arg = 'Default'){
$this -> a = $arg;
}
public function __set($var, $value){
switch($var){
case 'a':
if (is_string($value)) $this -> a = $value;
else throw new MyException('foo');
default:
throw new MyException02('foo02');
}
}
}
Otra opción:
Código PHP:
class Prueba{
private $a; //Debe ser una cadena, por ejemplo.
public function __construct($arg = 'Default'){
$this -> __set('a', $arg);
}
public function __set($var, $value){
switch($var){
case 'a':
if (is_string($value)) $this -> a = $value;
else throw new MyException('foo');
default:
throw new MyException02('foo02');
}
}
}
Otra:
Código PHP:
class Prueba{
private $a; //Debe ser una cadena, por ejemplo.
public function __construct($arg = 'Default'){
$this -> setA($arg);
}
public function __set($var, $value){
switch($var){
case 'a':
$this -> setA($value);
default:
throw new MyException02('foo02');
}
}
private function setA{
if (is_string($value)) $this -> a = $value;
else throw new MyException('foo');
}
}
Y lo último que se me ocurre es duplicar el código en el constructor:
Código PHP:
class Prueba{
private $a; //Debe ser una cadena, por ejemplo.
public function __construct($arg = 'Default'){
if (is_string($arg)) $this -> a = $arg;
else throw new MyException('foo');
}
public function __set($var, $value){
switch($var){
case 'a':
if (is_string($value)) $this -> a = $value;
else throw new MyException('foo');
default:
throw new MyException02('foo02');
}
}
}
¿Cual es vuestra opinión acerca de este problema? ¿O es simplemente que tengo un error en mi planteamiento sobre objetos y clases?
Gracias por vuestro tiempo.