【问题标题】:how to determine state of DB_DataObject instance?如何确定 DB_DataObject 实例的状态?
【发布时间】:2017-03-27 21:15:23
【问题描述】:

当我向各种 DB_DataObject 类添加方法时,我倾向于

Class Example extends DB_DataObject {
function methodx() //start fresh
{
    $newObject = DB_DataObject::factory($this->__table);
    /* do stuff with $newObject */
}

而不是

function methodx() //use current instance
{
    /* do stuff with $this */
}

我意识到我这样做是因为我不知道如何确定 $this 的状态。调用代码可能执行了以下任何操作:

$e = DB_DataObject::factory('Example'); $e->get(16); $e->methodx();
$e = DB_DataObject::factory('Example'); $e->somekey=$value; $e->methodx();
$e = DB_DataObject::factory('Example'); $e->somekey=$value; $e->find(); $e->methodx();

当我拿到“$this”时,如何确定它的状态?

对于使用当前实例与创建类的新实例,是否有经验法则或设计规则?

【问题讨论】:

  • 我认为这个问题的一般性/通用性无法让您满意。这很大程度上取决于 methodx() 如何依赖/与对象的状态交互。
  • 谢谢,公平点。但是关于我的第一个问题:methodx 如何确定 $this 是一个干净的实例(本质上是数据库中的一行)还是一个查找“设置”(其中 ->find() 将是适当的下一步)或一个 fetch “设置”(“获取”同上)。
  • 我猜不会,至少不会超过== null。如果它是一个新实例(如果我理解您的代码/问题),您的对象不应该有任何数据。编辑;对不起 - 刚刚看到这个问题的日期。

标签: php oop pear


【解决方案1】:

如果您的方法需要“干净状态”(类变量设置为其默认值),则只需创建一个新实例。

您只需节省一个对象实例化,这很便宜。


您可以通过使用[ReflectionClass::getDefaultProperties()][1] 并将它们与当前属性值进行比较来确定状态是否发生了变化。然后您必须检查是否动态添加了任何新属性。

或者,创建一个新实例并将所有属性与当前属性进行比较:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 2010-09-17
    • 2011-03-14
    相关资源
    最近更新 更多