【发布时间】:2011-03-24 10:28:47
【问题描述】:
让我们看看我是否可以正确地描述这个......
我有一个抽象类,当其他类从它扩展时,我希望将抽象类的数据重置为零。
我的想法是我有一堆类扩展它并使用 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"
对象(对象A)#3 (4) {
["className":protected]=>
字符串(7)“对象A”
[“第 1 列”]=>
空
[“第 2 列”]=>
空
[“第 3 列”]=>
空
}
string(21) "数组长度不为 0"
string(21) "数组长度不为 0"
string(21) "数组长度不为 0"
对象(ObjectB)#6 (4) {
["className":protected]=>
字符串(7)“对象B”
[“第 1 列”]=>
空
[“第 2 列”]=>
空
[“第 3 列”]=>
空
}
我希望 ObjectB 的第一个实例化输出“数组长度为 0”段,然后继续。
谁能帮忙?
【问题讨论】:
-
在我看来,这是继承是处理数据库访问的不好方法的原因之一。
-
是的,我目前可以很好地使用每个类实例化查询表列,但与往常一样,我想减少数据库查询的数量。
标签: php abstraction