php Абстрактные статические переменные сохраняются между вызовами статических методов - PullRequest
0 голосов
/ 10 сентября 2011

У меня есть абстрактный обобщенный класс 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
    }
}

Несколько классов наследуются от этого универсального класса с использованием extends.

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 - Вызов Init() на Generic, который хранит "system" в Generic::$tableName.
2 - Cenerate anested sibling (Part), который в свою очередь вызывает Init() на Generic, который затем перемещается Generic::$tableName в Generic::$oldTableName и сохраняет «деталь» в Generic::$tableName

Это все работает без проблем. Однако, когда яиспользуйте двух детей спина к спине, они разваливаются.

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

Использование двух спина к спине позволяет Generic каким-то образом сохраняться, так что Generic::$tableName == "system" при вызове Part::GetProperty(3, "ID");.

Любая идеякак это исправить?

1 Ответ

1 голос
/ 10 сентября 2011

Что вам нужно, это поздняя статическая привязка , которая была добавлена ​​в PHP 5.3.Измените определение $ tableName на protected static $tableName.Затем переопределите его точно так же, как в каждом дочернем классе.

...