2011-09-09 6 views
0

私はいくつかの静的変数と関数を持つPHP抽象クラスを持っています。php抽象静的変数は静的メソッド呼び出しの間に持続する

class Generic{ 
    public static $ID; 
    private static $tableName; 
    private static $oldTableName; 
    protected static $DAL; 

    public static function Init($tableName, $id=null) { 

     if(self::$tableName) 
      self::$oldTableName=self::$tableName; 

     self::$tableName=$tableName;   

     self::$DAL = new DAL(self::$tableName); 
    } 

    public static function RecallTableName(){ 
     if(self::$oldTableName){ 
      self::$tableName=self::$oldTableName; 
      self::$oldTableName=null; 
      return true; 
     } 
    } 

    public static function GetProperty($id, $columnName, $whereStatement = "1=1"){ 
     if(!self::$tableName) 
      return false; 

     //DO DB STUFF HERE 

     return; //RETURN WHAT DB CALLS DID HERE 
    } 
} 

いくつかのクラスを拡張し使用して、このジェネリッククラスを継承しています。

class Part extends Generic { 

    static function Init($tableName="part",$id = null) { 
     $return = parent::Init($tableName,$id); 
     new Part(); 
     return $return; 
    } 

    public static function destruct(){ 
     parent::RecallTableName(); 
    } 

    public function __destruct() { 
     Part::destruct(); 
    } 

    public static function GetProperty($id, $columnName, $whereStatement = "1=1") { 
     self::Init(); 
     return parent::GetProperty($id, $columnName, $whereStatement); 
    } 
} 

class System extends Generic { 

    static function Init($tableName="system",$id = null) { 
     $return = parent::Init($tableName,$id); 
     new System(); 
     return $return; 
    } 

    public static function destruct(){ 
     parent::RecallTableName(); 
    } 

    public function __destruct() { 
     Part::destruct(); 
    } 

    public static function GetProperty($id, $columnName, $whereStatement = "1=1") { 
     self::Init(); 
     return parent::GetProperty($id, $columnName, $whereStatement); 
    } 

    public static function GetInventory($PartManageIDToCheck) 
    { 
     return Part::GetInventory($PartManageIDToCheck); 
    } 
} 

このようにして、私は子供のメソッド呼び出しを実装すると、私は子供の死を突くことができます。さらに行く、私が呼び出すことができます。

System::GetInventory(1) 

この意志:
は 1 - Generic::$tableNameGenericに店舗 "システム" をInit()を呼び出します。
2 - ネストされた兄弟今度はその後、問題なくGeneric::$tableName

このすべての作品にGeneric::$tableNameGeneric::$oldTableNameに格納」の部分を移動するInit()Genericに呼び出します(パート)をCenerateしかし、私は背中合わせに2人の子供を使用する場合。それが崩壊してしまう。背中合わせに2を使用して

System::GetProperty(1, "ID"); 
Part::GetProperty(3, "ID"); 

Part::GetProperty(3, "ID");が呼び出されるときGeneric::$tableName == "system"ように何とか存続することが一般的なことができます。

この問題を解決する方法はありますか?

答えて

1

あなたが探しているのはlate static bindingで、PHP 5.3で追加されました。 $ tableNameの定義をprotected static $tableNameに変更します。それから、それぞれの子クラスでまったく同じ方法で再宣言します。

関連する問題