PHP 类设计:通过公共方法初始化私有属性并实现继承

DDD

DDD

2025-09-27

858人浏览

原创

PHP 类设计:通过公共方法初始化私有属性并实现继承

本教程探讨在PHP中如何不依赖__constructor显式初始化类中的私有属性,尤其是在处理继承场景时。我们将通过定义公共方法来设置父类的私有属性,并展示子类如何通过调用父类方法来访问这些属性,从而实现灵活且可控的对象初始化流程。

PHP中的属性初始化与__constructor

php中,__constructor是一个特殊的方法,用于对象创建时执行初始化操作。当您使用new classname(...)实例化一个对象并传入参数时,php会尝试调用该类的__constructor方法来处理这些参数。如果一个类没有定义__constructor方法,php会提供一个默认的空构造函数。然而,如果您尝试在没有定义__constructor的情况下,像new strawberry("strawberry", "red");这样向构造函数传递参数,php会抛出错误,因为它不知道如何处理这些参数。

私有属性(private)是类内部的封装机制,只能在该类内部访问。为了在对象外部设置这些私有属性,通常需要通过公共方法(public)进行操作,或者在构造函数中初始化。

通过公共方法初始化私有属性

在不使用__constructor的情况下,我们可以定义一个公共方法来专门负责设置类的私有属性。这种方法提供了更大的灵活性,允许我们在对象创建之后、需要时才进行属性初始化。

考虑以下Fruit类的例子,它拥有$name和$color两个私有属性:

<?php class Fruit {
  private $name;
  private $color;

  /**
   * 设置水果的名称和颜色。
   *
   * @param string $name 水果名称
   * @param string $color 水果颜色
   */
  public function describe($name, $color) {
    $this->name = $name;
    $this->color = $color;
  }

  /**
   * 打印水果的介绍。
   */
  public function intro() {
    echo "The fruit is {$this->name} and the color is {$this->color}.";
  }
}
?>

在这个Fruit类中,我们定义了一个公共方法describe(),它接受$name和$color作为参数,并用它们来设置类的私有属性。intro()方法则负责访问这些私有属性并输出信息。

继承与私有属性的间接访问

当一个子类继承父类时,它会继承父类的所有公共(public)和受保护(protected)方法。虽然子类不能直接访问父类的私有属性,但它可以调用父类的公共方法,而这些公共方法可以在父类内部访问其私有属性。

uni-app
uni-app

uni-app 官方文档、npm 包和项目创建入口。

下载

让我们创建一个Strawberry类,它继承自Fruit:

<?php class Strawberry extends Fruit {
  /**
   * 显示草莓的介绍。
   * 这里直接调用父类的intro方法。
   */
  public function message() {
    // 调用父类的公共方法来显示信息
    echo $this->intro();
  }
}
?>

在Strawberry类中,message()方法调用了父类Fruit的intro()方法。由于intro()是Fruit类的一个公共方法,它可以在Fruit类内部访问$name和$color私有属性。因此,即使Strawberry类本身无法直接访问$name和$color,它也能通过调用intro()方法来间接利用这些属性。

完整示例与调用流程

现在,我们可以将这些类结合起来,并展示如何实例化对象、初始化属性以及调用方法:

<?php // 定义父类 Fruit
class Fruit {
  private $name;
  private $color;

  public function describe($name, $color) {
    $this->name = $name;
    $this->color = $color;
  }

  public function intro() {
    echo "The fruit is {$this->name} and the color is {$this->color}.";
  }
}

// 定义子类 Strawberry
class Strawberry extends Fruit {
  public function message() {
    echo $this->intro();
  }
}

// 实例化 Strawberry 对象,不传入构造函数参数
$strawberry = new Strawberry();

// 调用 describe 方法设置私有属性
$strawberry->describe("Strawberry", "red");

// 调用 message 方法(或直接 intro 方法)显示信息
$strawberry->message(); // 输出: The fruit is Strawberry and the color is red.
echo PHP_EOL;

// 优化:直接调用父类的intro方法
$apple = new Strawberry();
$apple->describe("Apple", "green");
$apple->intro(); // 输出: The fruit is Apple and the color is green.
?>

在这个示例中,我们首先实例化Strawberry对象,但没有传递任何参数,因为Strawberry(及其父类Fruit)都没有定义接受这些参数的__constructor。接着,我们调用$strawberry->describe("Strawberry", "red");来设置Fruit类中的私有属性$name和$color。最后,通过调用$strawberry->message();或直接调用$strawberry->intro();来显示结果。

优化与最佳实践

  • 方法命名: 将原问题中的patients()方法重命名为更具描述性的describe(),这符合良好的编程实践,使方法意图更清晰。
  • 冗余方法移除: 如果子类Strawberry的message()方法仅仅是简单地调用父类的intro()方法,那么message()方法本身是多余的。可以直接在对象上调用intro()方法,使代码更简洁。
  • 灵活性: 这种通过公共方法进行初始化的方式,适用于需要延迟初始化或在对象生命周期中多次修改属性的场景。它与构造函数的一次性初始化形成互补。
  • 封装性: 私有属性的封装性得到了维护,外部代码仍然只能通过公共方法与对象进行交互。

总结

在PHP中,即使不使用__constructor,我们也可以通过定义公共方法来初始化类的私有属性。这种方法在处理继承时尤其有用,子类可以通过调用父类的公共方法来间接访问和操作父类的私有属性。这提供了一种灵活且可控的对象初始化机制,同时保持了良好的封装性。在设计类时,应根据实际需求选择最合适的属性初始化策略,无论是通过构造函数还是通过独立的公共方法。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

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

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

下载

相关标签:

php apple 封装性

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

相关专题

更多
火山引擎API Key获取教程
火山引擎API Key获取教程

火山引擎API Key适合需要调用火山引擎云服务、AI模型、火山方舟接口或其他开放能力的开发者参考。本专题整理控制台入口、账号认证、服务开通、API Key创建、密钥复制保存、权限检查、调用测试和Key无效等常见问题排查。

2026.08.04

0

10

火山引擎API接入教程
火山引擎API接入教程

火山引擎API接入适合需要在应用、脚本、后台服务或AI工具中调用火山引擎能力的开发者参考。本专题整理控制台入口、服务开通、API Key获取、接口地址配置、请求参数填写、调用测试、权限设置、额度查询和常见接口报错排查。

2026.08.04

2

10

火山引擎DeepSeek API调用教程
火山引擎DeepSeek API调用教程

火山引擎DeepSeek API适合需要在应用、脚本、智能体或AI编程工具中调用DeepSeek模型的开发者参考。本专题整理火山引擎控制台入口、模型服务开通、API Key获取、Base URL配置、模型名称填写、调用测试、额度查询和常见接口报错排查。

2026.08.04

0

10

火山引擎控制台操作教程
火山引擎控制台操作教程

火山引擎控制台中常用功能包括API密钥管理、模型调用配置、云资源查看、账单明细、用量统计和权限分配。本专题整理控制台基础操作、服务开通流程、Key创建与保存、费用消耗查看、子账号权限设置和调用失败排查,方便开发者完成日常管理。

2026.08.04

0

10

PDF与PPT格式转换操作方法及在线转换技巧
PDF与PPT格式转换操作方法及在线转换技巧

本专题聚焦 PDF 与 PPT 文件格式转换需求,整理 PDF 转 PPT 在线转换方法、PPT 批量转换 PDF 操作步骤、转换后格式错乱处理以及文档版式检查技巧。通过详细教程帮助用户掌握 PDF、PPT 双向转换方法,解决演示文稿制作、文件整理和办公格式转换中的常见问题,提高办公效率。

2026.07.31

112

6

PDF合并文件操作方法与在线批量合并技巧
PDF合并文件操作方法与在线批量合并技巧

本专题聚焦 PDF 文件合并与文档整理需求,整理多个 PDF 合并成一个文件、图片批量转换 PDF、合同附件合并发送以及在线 PDF 合并操作方法等实用教程。通过详细步骤介绍 PDF 合并流程、文件顺序检查技巧和免费在线合并方案,帮助用户快速整理零散文档,提高办公文件处理效率。

2026.07.31

86

8

PDF转Word在线转换与文档编辑处理方法
PDF转Word在线转换与文档编辑处理方法

本专题聚焦 PDF 转 Word 文件转换与办公文档处理需求,整理 PDF 在线转换成 Word、PDF 转可编辑 Word、PDF 文件格式转换操作步骤以及转换后版式错乱、图片无法编辑等常见问题解决方法。通过详细教程帮助用户快速掌握 PDF 转 Word 技巧,提高办公文件处理效率。

2026.07.31

87

5

CodeIgniter下载教程
CodeIgniter下载教程

本合集由PHP中文网精心整理,为您提供CodeIgniter下载教程与官方正版下载安装指南。内容涵盖CI3/CI4官方获取渠道、Composer依赖安装及环境配置全流程。助您安全、高效地搭建轻量级PHP框架,轻松开启Web应用开发之旅。

2026.07.30

116

10

CodeIgniter数据库配置指南
CodeIgniter数据库配置指南

PHP中文网为您提供CodeIgniter数据库配置指南合集。本专题全面解析CI框架数据配置方法,涵盖配置文件修改、多环境连接、动态切换数据库及常见连接错误排查等实战技巧。内容详实易懂,助您轻松掌握CodeIgniter数据库配置,快速解决开发难题,提升项目构建效率。

2026.07.30

45

15

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习