讓我們來看看我是否可以正確描述這個...PHP5和抽象類。爲每個子類分別提供類變量副本?
我有一個抽象類,當其他類從它擴展時,我想抽象類的數據被重置爲零。
這個想法是我有一堆類擴展這個和使用MySQL表的數據結構。我不想用每個類實例化查詢數據庫來確定類的數據(「來自tablename
的SHOW COLUMNS」)
因此,對於每個類,我希望它對每個「我們創建了這個類之前?如果是這樣,我們知道班級的結構,如果沒有,抓住表格列並創建班級以及存儲表格列供以後使用。「
我一直在使用以下來測試我的想法:
$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();
和腳本的輸出是:
串(17)的 「陣列長度被0」
串(21)的 「陣列長度不爲0」
串(21)的「陣列長度不是0「
對象(對象A)#3(4){
[ 「的className」:保護] =>
串(7) 「對象A」
[ 「列1」] =>
NULL
[「第2列「] =>
NULL
[」 列3" ] =>
NULL
}
串(21)的 「陣列長度不爲0」
串(21)的 「陣列長度不爲0」
string(21)「Array length is not 0」
對象(對象B)#6(4){
[ 「的className」:保護] =>
串(7) 「對象B」
[ 「列1」] =>
NULL
[「列2 「] =>
NULL
[」 列3" ] =>
NULL
}
我期待對象B的第一實例以輸出 「陣列長度爲0」 段,然後繼續。
任何人都可以幫忙嗎?
在我看來,這是繼承是一個不好的方式來處理數據庫訪問的原因之一。 – 2010-08-02 21:15:23
是的,我現在有工作很好,每個類實例化查詢表的列,但一如既往,我想減少數據庫查詢的數量。 – Charlie 2010-08-02 21:18:47