2011-09-09 70 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 - Cenerate嵌套兄弟(部分),後者又調用Init()Generic然後移到Generic::$tableNameGeneric::$oldTableName並存儲「部分Generic::$tableName

這一切工作沒有問題,但是,當我使用兩個孩子背靠背。它分崩離析。

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

使用兩個背靠背允許通用以某種方式繼續存在,使Generic::$tableName == "system"Part::GetProperty(3, "ID");被調用。

任何想法如何解決這個問題?

回答

1

你正在尋找的是late static binding它已被添加到PHP 5.3中。將$ tableName的定義更改爲protected static $tableName。然後在每個小孩課中重新聲明它的方式。