【问题标题】:Passing properties from class to base class将属性从类传递到基类
【发布时间】:2013-11-13 19:58:36
【问题描述】:

在我的程序中,一个对象代表数据库中的一行,它具有所有相同的数据以及 setter 和 getter 等。

每一列的值都保存到对象内的一个属性中。例如:

class Person extends Base {
  protected $name;
  protected $age;

  /* Setters & Getters */
}

在 Base 类上,我有一个 Save() 方法,它将根据 Person 类的属性创建更新查询。我无法弄清楚如何将属性传递给 Base 的 Save() 方法。我的想法很少,但我对它们不太满意。

1。 为所有属性添加前缀。比如“db_”:

protected $db_id;
protected $db_age;

Loop get_object_vars($this) and check the prefix.
  • 令人困惑

2。 添加一个数组,其中包含与数据库中的行相关的所有属性名称

protected $db_properties = array("id", "age");
protected $id;
protected $age;

Loop get_object_vars($this) and check if they are in the $db_properties array.
Or loop the $db_properties and get the properties.
  • 双重相同数据

3。 假设所有属性始终与数据库中的行相关。

Loop get_object_vars($this).
  • 无法为其他内容添加属性

还有其他方法可以做到这一点吗?

【问题讨论】:

  • 嗯,这是一个多态性的好地方。我不知道是否有一种干净的方法可以完全按照您的意愿行事。当我不得不使用另一种程序语言来实现类似的功能时,我只是将save() 方法定义为虚拟,然后在需要的地方覆盖它。
  • 这是 OP 正在使用的 PHP ORM 的一部分吗?
  • 就像@Leron 建议的那样,我会在Base 中创建一个抽象方法,并在每个派生类中覆盖它。

标签: php oop properties


【解决方案1】:

我不确定我是否理解了这个问题,但您考虑过字典吗? http://us2.php.net/manual/en/language.types.array.php

【讨论】:

  • 这不是答案
【解决方案2】:

您为什么需要将其传递回Base tho?当您实例化Person 时,Base 成为其中的一部分。所以如果Base 定义了一个变量,Person 也会有那个变量。

【讨论】:

  • 好吧,也许我用错了词。无论如何,问题是当 Save() 方法从 Base 继承并且我调用它时,它如何知道哪些属性与数据库行相关。例如 $name 和 $age 是,但是如果我为与数据库中的行不相关的类添加一个新属性,我不希望 Save() 函数尝试将它们添加到查询中。
  • 如果您需要将更多选项传递给您的函数,为什么不将数组作为参数传递并让您的保存函数只需将这些字段添加到查询中?
猜你喜欢
  • 1970-01-01
  • 2020-12-08
  • 2019-06-07
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
相关资源
最近更新 更多