【问题标题】:PHP5 & Abstract Classes. Separate copy of class variables for each child class?PHP5 和抽象类。每个子类的类变量的单独副本?
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 我正在考虑走这条路,我可能不得不这样做。将所有表定义存储在一个大数组/对象中并不那么优雅。 ://
【解决方案2】:

为了补充 Scott Saunders 所说的 - 为什么不使用单例呢?

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

【讨论】:

  • 我将不得不玩这个......我刚刚实现了一个基本的缓存,就像 Scott 建议的那样,但我将不得不研究这个......
  • 我建议多吨。这是一个与单例相关的模式,但对每个人来说都不是很常见。它允许多个实例。这样您就可以控制每个 db-table 有一个实例。
  • 更多精彩信息。多谢你们!也已经在研究这个了。
【解决方案3】:

在 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

【讨论】:

    【解决方案4】:

    感谢您的详细解释,我在其他网站上找到了非常基本的信息,希望这对其他人有所帮助。 http://www.phptechi.com/php-5-abstract-class.html

    【讨论】:

      猜你喜欢
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 2018-05-03
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多