0

データベース クラスが継承される親クラスを (遅延静的バインディングを使用して) 作成しました。各テーブル列を子クラスのパブリック プロパティとして割り当てるコンストラクタを作成しようとしています。これまでのところ、コンストラクターを子クラスに記述できましたが、これは問題なく動作しますが、すべての子クラスのプロパティが自動的に定義されるように、それを親クラスに配置したいと考えています。これが私の子クラスです:

class Sale extends DatabaseObject {

    protected static $table_name="invoices";
    protected static $db_fields = array();

    function __construct() {
        global $database;
        $query_cols = " SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_NAME LIKE '" . self::$table_name . "' AND TABLE_SCHEMA LIKE '" . DB_NAME . "' ORDER BY ORDINAL_POSITION ASC";
        $cols = $database->query($query_cols);
        while($col = $database->fetch_array($cols)) {
            if(!property_exists($this,$col['COLUMN_NAME'])) {
                $this->$col['COLUMN_NAME']=NULL;
                array_push(self::$db_fields,$col['COLUMN_NAME']);
            }
        }
    }
}

親でこのコンストラクターを使用するには、呼び出されたクラス プロパティを定義できる必要があります。

function __construct() {
    $class_name = get_called_class();
    $query_cols = " SELECT COLUMN_NAME FROM information_schema WHERE TABLE_NAME LIKE '" . static::$table_name . "' AND TABLE_SCHEMA LIKE '" . DB_NAME . "'";
    $query_cols .= " ORDER BY ORDINAL_POSITION ASC";
    $cols = $database->query($query_cols);
    while($col = $database->fetch_array($cols)) {
        if(!property_exists($class_name,$col['COLUMN_NAME'])) {
            // the code to define called class public property?!
        }
    }
}

前もって感謝します。

4

1 に答える 1

0

通常、クラスの静的メンバーにアクセスする場合は、self::$foo ではなく static::$foo を使用できますが、子クラスごとに空の初期静的変数を再宣言する必要があります。親の静的メンバー。

私がモデル システムに使用する別のアプローチは、クラス名を配列構造の一部として使用することです。

だから代わりに

array_push(self::$db_fields,$col['COLUMN_NAME']);

あなたがするだろう

array_push(self::$db_fields[$class_name],$col['COLUMN_NAME']);

このようにして、基本的に親クラス レベルで 1 つの配列を持ち、各要素は子クラス フィールドの配列であり、クラス名でキーが付けられます。

于 2016-07-13T08:14:56.260 に答える