У меня есть абстрактный обобщенный класс 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");
.
Любая идеякак это исправить?