0

0

PHP OOP 部分组合与继承和依赖注入

花韻仙語

花韻仙語

发布时间:2025-01-09 09:00:12

|

1113人浏览过

|

来源于php中文网

原创

php oop 部分组合与继承和依赖注入

本系列教程将循序渐进地讲解PHP面向对象编程(OOP)的基础知识,每个部分都专注于一个特定主题。无论您是OOP新手还是想巩固基础,本系列都将为您提供逐步指导。本节将重点讨论PHP中的组合、继承和依赖注入。 让我们开始这段PHP OOP学习之旅吧!

组合与继承

我们已经了解了面向对象编程中父类和子类之间的继承关系:子类继承父类,并访问父类的成员。

而组合则是将父类作为子类的属性,而不是继承它。同样可以访问父类的成员。

以下示例演示了组合和继承:

立即学习PHP免费学习笔记(深入)”;

代码示例

<code class="php">class Link {
   public string $name;
   public string $type;

   public function create(string $name, string $type): void {
      $this->name = $name;
      $this->type = $type;
   }

   public function show(): void {
      echo "name: {$this->name}, type: {$this->type}";
   }
}


// 继承示例
class ShortLink extends Link {
   // 其他功能
}


// 组合示例
class User {
   public Link $link;

   public function __construct() {
      $this->link = new Link();
   }
   // 其他功能
}

$user = new User();
$user->link->create("jamir", "short");</code>

在第一个示例中,ShortLink 类继承了 Link 类。在第二个示例中,User 类没有继承 Link 类,而是将 Link 类的实例作为其属性。 两者都能访问 Link 类的成员。

那么,既然继承可以访问所有内容,为什么还需要组合呢?组合需要声明额外的属性并在构造函数中设置值,这似乎增加了额外的工作。组合的优势在哪里呢?

继承使父类的所有成员(即使不需要)都可用于子类。为了解决这个问题,我们使用组合。组合允许子类只访问父类中所需的部分。

例如,Link 类有一个 show 方法,可以直接显示 ShortLink 类中创建的链接。但如果 User 类需要阻止直接查看用户创建的链接,而只在用户个人资料中显示链接呢?

这就是组合的用武之地。通过组合,User 类不会直接暴露 Link 类的所有方法,而是以受控的方式访问。

优先考虑组合而不是继承

我们已经了解了组合以及何时使用组合而不是继承。OOP中有一个原则:“优先考虑组合而不是继承”(Favor composition over inheritance)。这意味着,对于不需要访问父类所有成员的子类,应该优先选择组合而不是继承。

人民网AIGC-X
人民网AIGC-X

国内科研机构联合推出的AI生成内容检测工具

下载

如何决定何时使用组合,何时使用继承呢? 我们需要根据两种关系类型来决定:

  1. is-a 关系: 如果关系是“is a”(例如,ShortLink is a Link),则应该使用继承。
  2. has-a 关系: 如果关系是“has a”(例如,User has a Link),则应该使用组合。

代码示例

<code class="php">// 继承示例
class ShortLink extends Link {
   // 其他功能
}</code>

ShortLink 类继承自 Link 类,关系是“is-a”。

代码示例

<code class="php">// 组合示例
class User {
   public Link $link;

   public function __construct() {
      $this->link = new Link();
   }
   // 其他功能
}</code>

User 类与 Link 类使用组合,关系是“has-a”。

依赖注入

在了解依赖注入之前,我们需要了解什么是依赖。依赖是指子类通过继承或组合使用另一个类的成员。父类成为子类的依赖项。

在上面的组合示例中,User 类需要在构造函数中实例化 Link 类,因为 User 类依赖于 Link 类。 Link 类是 User 类的依赖项。 问题在于 Link 类的实例化与 User 类紧密耦合。

这种紧耦合意味着我们无法从外部更改依赖关系。

如果我们不自己实例化 Link 类,而是让用户提供,就能解决这个问题。用户在使用 User 类时,会将 Link 类作为依赖项传递给 User 类。这就是依赖注入。

代码示例

<code class="php">// 组合示例
class User {
   public Link $link;

   public function __construct(Link $link) {
      $this->link = $link;
   }
   // 其他功能
}

// 依赖注入示例
$user = new User(new Link());
$user->link->create("jamir", "short");</code>

在这个示例中,Link 类的依赖项是从外部注入的。 这是松耦合依赖关系,可以轻松从外部更改依赖关系。

如果 Link 类也有自己的依赖项,我们也可以通过 User 类将这些依赖项注入其中。

代码示例

<code class="php">// 组合示例
class User {
   public Link $link;

   public function __construct(Link $link) {
      $this->link = $link;
   }
   // 其他功能
}

// 依赖注入示例
$link = new Link(new Visitor()); //假设Visitor是Link的依赖
$user = new User($link);
$user->link->create("Jamir", "Short");</code>

通过依赖注入,我们可以灵活地注入任意数量的依赖项。 这就是本节的全部内容,我们下节课再见!

您可以在Github和LinkedIn上联系我。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

58

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

63

2025.11.27

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

58

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

63

2025.11.27

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

58

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

63

2025.11.27

github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

4145

2026.01.21

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

38

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 4.2万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.6万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 94人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号