【问题标题】:get only abstract (parent) vars for php class?只获取 php 类的抽象(父)变量?
【发布时间】:2014-09-15 01:57:54
【问题描述】:

我想创建一个函数来填充对象的属性,一些属性将在多个继承类之间共享,但一些属性将特定于继承类。我想处理来自父类的共享属性和来自继承类的特定于变体的属性。 (即在孩子中做特定的事情,然后为共享的事情调用 parent::populateStuff())

我没有返回重新散列所有变量名称,而是希望使用 get_class_vars 或 get_object_vars 来获取要填充的属性的名称。但是,当您运行 get_object_vars($this) 时,无论在哪个级别调用它,您都会获得“所有”继承变量(父变量和继承变量)。如果我用 get_class_vars 调用特定的类名,我可以获得仅限父级的东西,但我无法看到在继承类中添加或覆盖的内容。我也不想在代码中放置静态类名,因为它在重构时会降低可移植性。

我确实发现我可以在父级中运行 get_parent_class($this) 并且有效,但似乎是获取本地类名的一种迂回方式。 (get_class(self) puked) 但至少这在父级有效。

所以我的问题是,有没有更好的方法来获取抽象层类变量或类名? 有没有更好的方法来获得继承的唯一属性? (我可以与父变量进行数组拼接,但这会排除任何被覆盖的内容)

【问题讨论】:

  • 我应该补充一点,属性是从每个变体中的两个[或更多]数据库表/查询中填充的。一种特定于抽象属性,另一种特定于继承的类属性。因此,就价值而言,它[几乎] 是一对一的。我可以从 db 行返回,但有些表的 id 用于交叉引用/链接,我在类中不需要,有些变体确实覆盖了第一个表中的值。
  • duh - 好的,第一个问题是脑子放屁 - __CLASS__ 让我得到了我想要的。 ReflectionClass 为我提供了任何给定级别的设置信息,我现在将使用它,但我仍然很好奇是否有其他方法不使用 ReflectionClass

标签: php inheritance properties


【解决方案1】:

使用反射,我想出了这个并且它有效,但我仍然想知道是否有一种方法可以在不调用反射类的情况下做到这一点:

/**
 * @param object|Zend_Db_Table_Row $row
 */
public function populateThisLayer($row) {
    $reflect = new \ReflectionClass(__CLASS__);
    foreach($reflect->getProperties() as $_p) {
        $_k = $_p->name;
        if(($_p->class == __CLASS__) && property_exists($row, $_k)) {
            $this->$_k = (is_numeric($row->$_k)) ? floatval($row->$_k) : $row->$_k;
        }
    }
}

【讨论】:

  • 这让我想到了另一个问题。有什么办法可以知道这个函数是从哪里调用的?如果我按原样使用它,当从继承类调用时,它只会填充父类属性。我可以将类传入,但如果它能够确定它是从抽象中的某处调用还是从某个继承层调用,那就更好了。
猜你喜欢
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多