【问题标题】:How do you keep track where an inherited method comes from您如何跟踪继承方法的来源
【发布时间】:2018-10-04 18:07:49
【问题描述】:

考虑这个简单的类示例:

// 父亲.php

class father {
    public function wallet () {}
}

//mother.php

class mother extends father { }

//女儿.php

class daughter extends mother { 

    public function shop {

        $this->wallet();

    }   
}

是否有一种约定/编码实践可以快速告诉您wallet() 来自类father

这没什么大不了的,但是在查看旧代码(没有 IDE)时,很高兴快速了解继承方法的来源。

【问题讨论】:

  • 您可以阅读代码(费力,但有效),您可以使用 IDE 功能(又好又快),也可以以编程方式检查课程。这应该就是你所需要的。您最不想做的事情是在编写 $this->wallet() 时需要一些常规符号,以便您可以追踪它的来源。
  • 另外,这里政治正确的实现需要多重继承,而不是父权继承。 ??????

标签: php class oop object inheritance


【解决方案1】:

如果没有 IDE(或大量文档),继承并不是最容易实现的。

PHPDoc 确实有 @see 标记,您可以将其用作:

/**
* @see father::wallet()   For logic pertaining to wallet retrieval
*/
public function shop {

    $this->wallet();

}

除此之外,您还想确保您的继承有意义。我敢肯定这只是一个简单的例子,但我看不出女儿有什么理由继承父亲。

女儿可以扩展一个孩子,在孩子中,您可以拥有从父母(或父亲)那里拉钱包的逻辑。

【讨论】:

  • 注释daughter的问题是mother中的实现可能会改变,然后注释与现实不符......
  • 更不用说,记录每个继承方法的使用会非常麻烦,因此我对“大量文档”的注释。我不推荐这条路线,但如果你想要彻底并且你确实花时间让文档块更新更改,这是可能的,因为在对母亲进行更改之前你可能还是想看看这个方法::wallet() 因为这会受到影响。
【解决方案2】:

虽然看似微不足道,但必须遍历父类的序列:

$seekMethod = 'wallet';
$stack = [];
foreach(class_parents('daughter') as $parent){
    foreach((new ReflectionClass($parent))->getMethods() as $method){
        if($seekMethod == $method->name){
            $stack[] = "{$method->class}::{$method->name}() in {$parent}";
            echo "Found ".end($stack);
        }
    }
}

echo "{$seekMethod} is defined in ".end($stack);

会输出如下内容:

Found father::wallet() in mother 
Found father::wallet() in father 
wallet is defined in father::wallet() in father

或者更简单,不考虑继承:

foreach((new ReflectionClass('daughter'))->getMethods() as $method){
    if($seekMethod == $method->name){
        echo "Found {$method->class}::{$method->name}";
    }
}

将输出例如

Found father::wallet

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多