让我们看看我是否可以正确描述这一点......
我有一个抽象类,当其他类从它扩展时,我希望将抽象类的数据重置为零。
我的想法是,我有一堆类扩展了这个并使用MySQL表来实现数据结构。我不想在每个类实例化中查询数据库以确定类的数据(“SHOW COLUMNS FROM tablename
”。
因此,对于每个类,我都希望每个类“我们之前是否创建了这个类?如果是这样,我们知道类的结构,如果没有,抓住表列并创建类以及存储表格列供以后使用。“
我一直在使用以下内容来测试我的想法:
$columns = array("Column 1", "Column 2", "Column 3");
abstract class AbstractClass {
protected static $colFields = array();
public function __construct() {
$this->setVars();
}
private function setVars() {
global $columns;
if (count(self::$colFields) == 0) {
var_dump("Array length is 0");
foreach ($columns as $key) {
self::$colFields[] = $key;
if (!isset($this->$key))
$this->$key = null;
}
}
else {
var_dump("Array length is not 0");
foreach (self::$colFields as $key) {
$this->$key = null;
}
}
}
public function test() {
var_dump($this);
}
}
class ObjectA extends AbstractClass {};
class ObjectB extends AbstractClass {};
$objectAA = new ObjectA();
$objectAB = new ObjectA();
$objectAC = new ObjectA();
$objectAC->test();
$objectBA = new ObjectB();
$objectBB = new ObjectB();
$objectBC = new ObjectB();
$objectBC->test();
脚本的输出是:
string(17)“数组长度为0”
string(21)“数组长度不为0”
string(21)“数组长度不为0”
object(ObjectA)#3(4){
[ “的className”:保护] =>
string(7)“ObjectA”
[“第1栏”] =>
NULL
[“第2栏”] =>
NULL
[“第3栏”] =>
NULL
}
string(21)“数组长度不为0”
string(21)“数组长度不为0”
string(21)“数组长度不为0”
object(ObjectB)#6(4){
[ “的className”:保护] =>
string(7)“ObjectB”
[“第1栏”] =>
NULL
[“第2栏”] =>
NULL
[“第3栏”] =>
NULL
}
我期待ObjectB的第一个实例化输出“Array length is 0”段,然后继续。
有人可以帮忙吗?
答案 0 :(得分:4)
我建议您不要将缓存的表信息存储在抽象类中。创建一个名为TableInformationRepository的新类或类似的东西。让您的子类或抽象类查询TableInformationRepository以获取有关表/类的信息。在TableInformationRepository中,缓存您希望通过类名或表名键入的信息。
答案 1 :(得分:0)
要添加Scott Saunders所说的内容 - 为什么不使用单身人士?
答案 2 :(得分:0)
在PHP中,如果不重新声明子类中的protected / public静态字段,它们都将属于同一个引用集。这意味着受保护属性的更改将反映在所有类中。
示例:
class A {
public static $field = "1";
}
class B extends A { }
B::$field = 2;
echo A::$field; //2
另一方面:
class A {
public static $field = "1";
}
class B extends A {
public static $field = "1";
}
B::$field = 2;
echo A::$field; //1
您也可以手动破坏参考集:
class A {
public static $field = "1";
}
class B extends A { }
$v = 2;
B::$field = &$v;
unset($v);
echo A::$field; //1
答案 3 :(得分:0)