从子类中的父类更新数组项

时间:2017-12-10 01:12:29

标签: php arrays object

我在PHP中对OOP相当新。我正在尝试更新由其父类中的循环生成的数组中的项的值。在我的代码中,类DatabaseObject创建一个包含所有表字段名称和值对的属性数组。数组的内容用于创建SQL查询以写入数据库。我试图解决的问题是我需要使用子User类中的加密密码更新属性['hashed_pa​​ssword']项。我不太确定如何更新该数组项,以便将散列密码提交到数据库,而不是通过表单提交。

class DatabaseObject {

  public function create(){
    global $db;

    static::$attributes = [];
    foreach (static::$db_fields as $field) {
     if(property_exists($this, $field)){
       $attributes[$field] = $this->$field;
      }
    }

    $sql = "INSERT INTO " . static::$table_name . " (";
    $sql .= join(", ", array_keys($attributes));
    $sql .= ") VALUES ('";
    $sql .= join("', '", array_values($attributes));
    $sql .= "')";

   $result = mysqli_query($db, $sql)
   }
}

class User extends DatabaseObject {

  protected static $table_name="users";
  protected static $db_fields = array("user_id", "username", "hashed_password", "email");

  public $user_id;
  public $username;
  public $hashed_password;
  public $email;

  self::attributes['hashed_password'] = password_hash($this->attributes['hashed_password'], PASSWORD_BCRYPT);
}

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

对我有用的解决方案只是覆盖User对象中的create函数并使用散列密码手动更新数组,因此新的User对象变为:

class User extends DatabaseObject {
  public function create(){
  global $db;

 static::$attributes = [];
 foreach (static::$db_fields as $field) {
  if(property_exists($this, $field)){
   $attributes[$field] = $this->$field;
  }
 }

$attributes['hashed_password'] = password_hash($attributes['hashed_password'], PASSWORD_BCRYPT); 

$sql = "INSERT INTO " . static::$table_name . " (";
$sql .= join(", ", array_keys($attributes));
$sql .= ") VALUES ('";
$sql .= join("', '", array_values($attributes));
$sql .= "')";

 $result = mysqli_query($db, $sql)
 }
}
}

不确定这是否是最有效的方法,但它确实有效。