【问题标题】:php Abstracted static variables persist between static method callsphp 抽象的静态变量在静态方法调用之间保持不变
【发布时间】:2011-09-09 20:11:26
【问题描述】:

我有一个带有几个静态变量和函数的 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 - 在Generic 上调用Init(),它将“系统”存储在Generic::$tableName 中。
2 - 生成一个嵌套的兄弟(Part),它反过来在Generic上调用Init(),然后将Generic::$tableName移动到Generic::$oldTableName并存储“part in Generic::$tableName

这一切都没有问题。但是,当我背靠背使用两个孩子时,它就会分崩离析。

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

使用这两个背靠背允许 Generic 以某种方式持续存在,以便在 Part::GetProperty(3, "ID"); 被调用时 Generic::$tableName == "system" 被调用。

知道如何解决这个问题吗?

【问题讨论】:

    标签: php static-methods abstraction


    【解决方案1】:

    您正在寻找的是late static binding,它是在 PHP 5.3 中添加的。将 $tableName 的定义更改为 protected static $tableName。然后在每个子类中以完全相同的方式重新声明它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多