如何抽象php数据库对象类以使用可变列

时间:2019-06-02 23:55:18

标签: php database

我有一个PHP类,其实例是数据库表中的行。该类具有允许创建,读取,更新和删除与该类的给定实例相对应的行的方法。就目前而言,它运作良好,但是我目前在代码中明确命名了每个数据库列。结果,当我添加或删除列时(偶尔但并非罕见的操作),我必须更新该类以包括那些列名。我想对我的代码进行抽象处理,以便它首先查询数据库以确定需要填充的列。(顺便说一下,我正在使用PHP 7.2)

下面的代码是我现在所拥有的,但是我对如何抽象它感到茫然,这样它就不会与拼写每个特定的列名相关联。

<?php
class Example extends DatabaseObject {
    static protected $table_name = "data";
    static protected $db_columns = ['id','column1', 'column2', 'column3', 'column4'];

    public $id;
    public $column1;
    public $column2;
    public $column3; 
    public $column4;

    public function __construct($args=[]) {
        $this->column1 = $args['column1'] ?? '';
        $this->column2 = $args['column2'] ?? '';
        $this->column3 = $args['column3'] ?? '';
        $this->column4 = $args['column4'] ?? '';
    }

    public function attributes() {
      $attributes = [];
      foreach (static::$db_columns as $column) {
        if ($column === "id") { continue; }
        $attributes[$column] = $this->$column;
      }
      return $attributes;
    }

    public function save() {
        // calls private methods to validate, sanitize, then create or update, acc. to context
        // to create, it preps an sql statement based on a call to attributes()
    }

}
?>

2 个答案:

答案 0 :(得分:1)

我不确定您想走多远。这是一种可以抽象一行数据的方法。

您会注意到我使用[mail function] ; For Win32 only. ; http://php.net/smtp SMTP = smtp ; http://php.net/smtp-port smtp_port = 587 ; For Win32 only. ; http://php.net/sendmail-from sendmail_from = exchange_shop@uniwa.gr ; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). ; http://php.net/sendmail-path sendmail_path = /usr/sbin/sendmail -t -i set函数来访问数据。

get

答案 1 :(得分:0)

您可能需要查看魔术方法byte[] store = (data, 0, bytes); __get()。基本上,它们是类方法,在尝试访问类中不存在的属性时会触发它们,因此您可以使用它们的后备。

请查看文档:{​​{3}}