【问题标题】:PHP: class inheritance - best practice [closed]PHP:类继承 - 最佳实践 [关闭]
【发布时间】:2022-01-14 12:49:21
【问题描述】:

我知道有 extends 用于类继承,但我需要不同的方法:

我想实现如下类结构:

c_main
|
--- c_subclass1
|
--- c_subclass2
|
--- c_subclass3

想法: c_main 拥有所有类的功能,如抓取、状态消息、数据库和错误处理、日志记录.. 所以子类总是需要访问主类。

详细: subclass1 将为所有子类加载主 ID,因此子类需要相互通信 - 例如: subclass1 将获得 id - subclass2 将基于它进行广泛的抓取并收集数据并将某些内容传递给子类 3,子类 3 也将收集数据。 所有子类都需要访问父类,因为它将写入子类之间正在进行的进程的持续日志文件。 最后,c_main 将包含所有子类的最终数据。

我目前的做法如下

class c_main
{
    public $id;
    function __construct()
    {
        $this->sub1 = new c_subclass1(this);
        $this->sub2 = new c_subclass2(this);
        $this->sub3 = new c_subclass3(this);
    }

    function log($msg, $obj)
    {
        $class = get_class($obj);
        $msg = "class: " . $class . " | " . $msg;
        // write $msg to consistent log 
    }

    function scrape($url, $obj)
    {
        $this->log("scraping: $url", $obj);
    }

    function load()
    {
        $this->id = $this->sub1->get_id();
        $data2 = $this->sub2->get_data();
        $data3 = $this->sub3->get_data();

        $this->all = array( $data1, $data2, $data3 );
    }

}

subclass1 看起来像这样:

class c_subclass1
{
    function __construct( $oMain )
    {
        $this->oMain = $oMain;
    }

    function get_id()
    {
        $this->oMain->log("getting id  ..", $this);
        $id = $this->oMain->scrape("www.foo.com", $this);
        return $id;
    }

}

subclass2 看起来像这样:

class c_subclass2
{
    function __construct( $oMain )
    {
        $this->oMain = $oMain;
    }

    function get_data()
    {
        $this->oMain->log("getting data for id " . $this->id . " ..", $this);
        $aData = $this->oMain->scrape("www.bar.com?id=" . $this->id, $this);
        return $aData;
    }

}

我想知道:这是最好的方法还是有更好的方法?

【问题讨论】:

  • 只要定义c_themoviedb extends c_movie之类的类,将c_movie的属性和方法定义为protected,这样孩子就可以访问了。
  • 那你为什么要在父类中创建子类的对象呢?
  • 为什么不直接使用extends?这正是你所需要的.....
  • 我知道这听起来很奇怪,但我也希望子类能够在解析过程中相互通信,所以我总是需要访问 c_movie 对象
  • 您的问题似乎是关于组合与继承。虽然我想知道为什么 c_themoviedb 和其他人需要了解这部电影?

标签: php class inheritance


【解决方案1】:

如果你想继承多个类但php不允许超过1个继承并且php提供Traits机制,阅读php文档将帮助你找到最好的方法。

Trait 旨在减少单继承的一些限制

【讨论】:

  • 也许可以分享您对Traits 的实现,而不仅仅是定义?无论如何,我认为这是 OP 问题的一个很好的用例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多