PHP存储库模式-更新功能

PHP存储库模式-更新功能,php,design-patterns,Php,Design Patterns,基本上,我正在编写一个更新方法 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 obj

基本上,我正在编写一个更新方法

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";
  }
}
现在,在我的dao中,我想在无法编写条件更新(只更新正在设置的值)时更新记录,因为您不知道对象上的属性是否已设置..并且您不能仅仅依靠
empty
或检查null,如果您真的想将值设置为null

使用神奇的方法
\uuuu get、\uu set、\uu isset
像这样重构
实体
类会是反模式的吗

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]);
  }
}

或者有没有比在Dao中传递数组而不是对象更好的方法

如果你真的需要这些神奇的方法,就使用它们吧。不确定你是否真的需要它们。但是你不能使用一个框架或者一些预先制作好的东西,比如Laravel吗?或者你需要从头开始,还是为了一个更大的系统?如果你真的需要神奇的方法,使用它们。不确定你是否真的需要它们。但是你不能使用一个框架或者一些预先制作好的东西,比如Laravel吗?或者你需要从头开始,还是为了一个更大的系统?