Я работаю над написанием метода обновления, в основном
class Entity {
public $a;
public $b;
}
class EnitityRepository {
public function update(int $id, Entity $entity){
$this->dao->update($id, $entity);
}
public function get(int $id){
//does a look-up and returns an object of Entity
}
}
class Dao {
public function update(int $id, Entity $entity){
$sql = "Update ABC";
if(isset($entity->a) {
$sql .= "set a = :a";
}
if(isset($entity->b) {
$sql .= ", set b = :b";
}
$sql .= " WHERE id = :id";
}
}
Теперь, в моем дао, я хочу обновить запись, когда нет возможности записать условное обновление (обновлять только те значения, которые быть установленным), поскольку вы не знаете, установлено ли свойство объекта или нет ... и вы не можете просто полагаться на empty
или проверять ноль, как если бы вы действительно хотели установить значение как ноль.
Было бы анти-паттерном использовать маги c метод __get, __set, __isset
для рефакторинга класса Entity
следующим образом?
class Entity {
private $data = [];
private $properties = [
'a' => true,
'b' => true,
];
public function __set($name, $value) {
if (array_key_exists($name, $this->properties)) {
$this->data[$name] = $value;
} else {
//throw exception
}
}
public function __get($name) {
if (array_key_exists($name, $this->data)) {
return $this->data[$name];
}
return null;
}
public function __isset($name) {
return isset($this->data[$name]);
}
public function __unset($name) {
unset($this->data[$name]);
}
}
Или есть ли лучший способ, чем передать массив вместо объекта в Дао.