Cita: Removi get y set y el codigo funciona igual (era obvio sin siquiera removerlos). solo pido un ejemplo practico para poderlo ver mas claro ¿Tan dificil es entenderlo?
Mira la utilidad de usar
__get y
__set es de crear objetos mas dinámicos respetando la encapsulacion te dejo un ejemplo practico de su uso.
Código PHP:
Ver originalclass User{
private $dbh;
public function __construct($user) {
$this->dbh = new PDO('mysql:host=localhost;dbname=dbtest', '','');
$query = "SELECT * FROM users WHERE username = ?";
$stm = $this->dbh->prepare($query);
$stm->execute(array($user)); $this->data = $stm->fetch(PDO::FETCH_ASSOC);
}
public function __set($name, $value) {
if(isset($this->data[$name])){ $this->data[$name] = $value;
}
}
public function __get($name) {
if(isset($this->data[$name])){ return $this->data[$name];
}
}
public function save() {
$sql = "UPDATE users SET name = ?, lastname = ?, username = ?, password = ? WHERE id_user = ?";
$stm = $this->dbh->prepare($sql);
$stm->execute(array($this->name,$this->lastname,$this->username,$this->password,$this->id_user)); }
}
$user = new User('jjsavines');
echo $user->name .'<br />';
echo $user->password .'<br />';
echo $user->username .'<br />';
$user->password = 'superv'; // change user password
$user->save();
echo $user->password .'<br />';
En este ejemplo me hice una mini implementación de un
ActiveRecord, la ventaja en usar los métodos mágicos es que si mas adelante altero la estructura de la tabla
users mi clase queda sin cambios, bueno con excepción del método
save pero puede modificarse para que pase los elementos que debe y de esa forma no depender de los cambios en la tabla.
Este ejemplo es sencillo se puede hacer cosas mas complejas aprovechando los métodos, Pero como todo hay un punto flaco y es que es un problema para documentarlos con herramientas como phpDocumentor, pueden ser confusos y ademas siempre esta la opción de agregar un
set o
get manualmente.
Prueba el ejemplo por que lo estoy haciendo a la carrera y hay varias cosas que pase por alto como lo del save.