【问题标题】:PHP Extending A Class And Using Another Class With The Same BasePHP扩展一个类并使用另一个具有相同基数的类
【发布时间】:2017-03-26 05:16:18
【问题描述】:

我对 PHP 还很陌生,我想知道将类变量设置为另一个类的新实例是否会导致任何问题,而另一个类又扩展了与第一个类相同的基类。基本上,如果我有两个类 A 和 B,它们都扩展了 Base 类。我可以有一个类 C,它扩展 A 并创建 B 的新实例吗?我想做这样的事情:

// In its own file (BaseClass.php)
    class Base {
        public function log($message) {
            // Write $message to the log
        }
    }

// In its own file (ClassA.php)
    require_once("path/to/BaseClass.php");
    class A extends Base {
        public function test() {
            // Do some test
        }
    }

// In its own file (ClassB.php)
    require_once("path/to/BaseClass.php");
    class B extends Base {
        public function getData() {
            // Get data here
        }
    }

// In its own file (ClassC.php)
    require_once("path/to/ClassA.php");
    require_once("path/to/ClassB.php");
    class C extends A {
        protected $classB;

        public function run() {
            // Initialize an instance of class B
            $this->classB = new B;

            // Can call log() function of Base class because
            // class C extends class A which extends Base
            $this->log("Log Message");

            // Can also call log() function of Base class through
            // class B because class B extends Base
            $this->classB->log("Another Log Message");
        }
    }
    $classC = new C;
    $classC->run();

(根据我的理解)在同一个 C 类中两次初始化 Base 类会不会有任何冲突,并且以两种不同的方式调用 Base 的 log() 函数是否真的有效?

【问题讨论】:

  • 您的现实世界需要什么来做到这一点?在写一行之前,这闻起来是一个糟糕的实现
  • @Trent 我有一个类从我的家庭路由器请求数据。我希望这个 Router 类扩展我的 Base 类,它将包含一些“通用”功能。然后我有另一个类——我们称之为“NetworkInfo”——它解析从我的路由器检索到的数据,并将数据加载到数据库表中。我还有一个用于管理数据库事物的类。我希望数据库和路由器类都扩展基类。 NetworkInfo 类扩展了 Router 类,但还需要能够访问 Database 类的功能。
  • 我强烈建议不要继续使用您想出的模式。这是一篇很棒的文章,有助于理解 SOLID 软件设计原则,听起来您的应用程序偏离了scotch.io/bar-talk/… - 我知道这绝不会回答您的问题;但这是一个错误的问题,鼓励您继续以这种方式设计软件也无济于事。
  • @Trent 感谢您提供信息和链接。那篇文章绝对超出了我的想象。我需要一些时间来思考这个问题。我仍在努力寻找拥有所有其他类使用的基类的正确方法,例如用于日志记录,而无需初始化基类的多个实例。是否不可能有多个进程使用的单个基类,即使部分进程相互重用?
  • @Trent 再次感谢您朝着更好的方向前进。一直在研究 SOLID 原则,特别是 Liskov 替换原则和“组合优于继承”。这两篇文章有所帮助:propelorm.org/blog/2011/03/03/…thoughtworks.com/insights/blog/… 第一篇是 PHP 中的特征之前,所以我试图牢记这一点。不管怎样,看来我还有很多东西要学。希望我能接受您的评论作为答案。再次感谢。

标签: php inheritance class-hierarchy


【解决方案1】:

我强烈建议不要继续使用您想出的模式。

这是一篇很棒的文章,有助于理解 SOLID 软件设计原则,听起来您的应用程序偏离了https://scotch.io/bar-talk/s-o-l-i-d-the-first-five-principles-of-object-oriented-design

我知道这绝不会回答您的问题;但这是一个错误的问题,鼓励您继续以这种方式设计软件也无济于事。

【讨论】:

  • 如果您不打算回答这个问题,请留下评论
  • 这是 5 年前的朋友 - 它被接受为 OP 从中学到的正确答案:“希望我能接受您的评论作为答案。再次感谢”但你知道- 很高兴看到人们仍然潜伏在周围寻找令人烦恼的事情。继续努力
最近更新 更多