2016-07-13 4 views
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?! 
     } 
    } 
} 

感謝。

答えて

0

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

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

ので、代わりに

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

のは、各要素に、

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

子クラスのフィールドの配列を使用すると、基本的には親クラスレベルで単一の配列を持っている。この方法をするだろう、彼らのクラス名で。

+0

クラスのパブリックメンバーはどうですか?静的メンバーの場合は「静的」を使用しますが、一般メンバーはどうですか?どのように私はそれを適用できますか? – MehdiK

+0

静的およびパブリックは相互に排他的ではなく、メンバーはパブリック、保護またはプライベート、静的または非静的のいずれでもかまいません。非スタティックメンバの場合は、 '$ this'(または別の変数参照)を使ってアクセスするので、' self'、 'static'などの必要はありません。 – Stephen

+0

ありがとうございます '$ this'問題を解決しました! – MehdiK

関連する問題