【发布时间】: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