PHP5&抽象类。每个子类的类变量的单独副本?

时间:2010-08-02 21:10:00

标签: php abstraction

让我们看看我是否可以正确描述这一点......

我有一个抽象类,当其他类从它扩展时,我希望将抽象类的数据重置为零。

我的想法是,我有一堆类扩展了这个并使用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”段,然后继续。

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:4)

我建议您不要将缓存的表信息存储在抽象类中。创建一个名为TableInformationRepository的新类或类似的东西。让您的子类或抽象类查询TableInformationRepository以获取有关表/类的信息。在TableInformationRepository中,缓存您希望通过类名或表名键入的信息。

答案 1 :(得分:0)

要添加Scott Saunders所说的内容 - 为什么不使用单身人士?

http://php.net/manual/en/language.oop5.patterns.php - 示例#2

答案 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)

谢谢你的详细解释,我发现其他网站的基本信息非常希望对别人有所帮助。 http://www.phptechi.com/php-5-abstract-class.html