当前位置: 首页 > news >正文

辅助构造函数相关学习以及php实现

https://mp.weixin.qq.com/s/J9hgLTxYi7ZJdFVG2VszQg

 

对这个文章进行摘要生成


### 总体概要
文章阐述了在对象创建过程中,辅助构造函数(或称为“多个”构造函数)的重要性,它们为代码增加了功能性逻辑,并允许根据需求调整初始参数的数量,从而提高对象创建的灵活性和可维护性。文章以PHP和Kotlin语言对比为例,说明了PHP不支持辅助构造函数,而Kotlin则支持。通过一个KYC问卷的创建示例,展示了如何使用私有构造函数和公共静态方法来控制对象的创建,以确保业务逻辑的正确性和代码的简洁性。这种方法避免了构造函数因业务逻辑而变得复杂,提高了代码的可读性和维护性,使开发人员能够更清晰地理解业务上下文。

#### 核心要点
1. **辅助构造函数的作用**:
    - 辅助构造函数在对象创建中提供额外逻辑,允许根据实际需求调整参数,确保灵活性和可维护性。
2. **PHP与辅助构造函数**:
    - PHP本身不支持辅助构造函数,而Kotlin等语言提供了这一特性。
3. **经典构造函数的问题**:
    - 使用经典构造函数可能导致不一致的模型创建,允许违反业务规则。
4. **次要构造函数的引入**:
    - 通过私有构造函数和静态工厂方法,实现特定业务逻辑的构造函数,确保数据一致性。
5. **次要构造函数的实现**:
    - 每种就业状态对应一个静态方法,确保创建对象时遵循正确参数组合。
6. **次要构造函数的优势**:
    - 提高代码可读性,减少构造函数中的业务逻辑,降低出错可能性,增强代码维护性。
# 🌟 要点提炼
### 1. 私有构造函数在辅助构造函数中的作用是什么?

私有构造函数确保对象只能通过特定的公共方法创建,从而控制对象的创建流程。
### 2. 使用辅助构造函数的主要目的是什么?

主要目的是简化对象创建过程,增强代码的结构化,提高代码的可维护性和减少错误的可能性。
### 3. 辅助构造函数如何提高代码的可读性和维护性?

辅助构造函数让开发者能快速理解业务上下文,减少冗长条件检查,提高了代码的可读性。
 

 

在PHP中,虽然语言本身不直接支持辅助构造函数(即多个构造函数),但我们可以通过使用静态工厂方法来模拟这一行为。以下是一个使用静态工厂方法的PHP示例,它展示了如何根据不同的就业状态创建KYC问卷对象:

```php
<?php

class EmploymentStatus {
    const EMPLOYED = 'employed';
    const SELF_EMPLOYED = 'self_employed';
    const RETIRED = 'retired';
    const UNEMPLOYED = 'unemployed';
}

class Questionnaire {
    private $employmentStatus;
    private $incomeSource;
    private $annualIncomeRange;

    private function __construct($employmentStatus, $incomeSource = null, $annualIncomeRange = null) {
        $this->employmentStatus = $employmentStatus;
        $this->incomeSource = $incomeSource;
        $this->annualIncomeRange = $annualIncomeRange;
    }

    public static function create($employmentStatus, $incomeSource = null, $annualIncomeRange = null) {
        switch ($employmentStatus) {
            case EmploymentStatus::EMPLOYED:
                if ($incomeSource === null || $annualIncomeRange === null) {
                    throw new Exception("Employed users must provide income source and annual income range.");
                }
                break;
            case EmploymentStatus::SELF_EMPLOYED:
                if ($annualIncomeRange === null) {
                    throw new Exception("Self-employed users must provide annual income range.");
                }
                break;
            case EmploymentStatus::RETIRED:
                if ($annualIncomeRange === null) {
                    throw new Exception("Retired users must provide annual income range.");
                }
                break;
            case EmploymentStatus::UNEMPLOYED:
                // No additional fields required for unemployed users
                break;
            default:
                throw new Exception("Invalid employment status.");
        }

        return new self($employmentStatus, $incomeSource, $annualIncomeRange);
    }

    // 其他方法...
}

// 使用静态工厂方法创建对象
$employed = Questionnaire::create(EmploymentStatus::EMPLOYED, 'Company Name', [60000, 80000]);
$selfEmployed = Questionnaire::create(EmploymentStatus::SELF_EMPLOYED, null, [50000, 60000]);
$retired = Questionnaire::create(EmploymentStatus::RETIRED, null, [20000, 30000]);
$unemployed = Questionnaire::create(EmploymentStatus::UNEMPLOYED);

?>
```

在这个例子中,`Questionnaire`类有一个私有的构造函数,这意味着我们不能直接使用`new`关键字来创建`Questionnaire`对象。相反,我们使用一个公共的静态方法`create`来创建对象。这个方法根据传入的就业状态参数来验证输入,并确保创建的对象遵循正确的业务规则。这样,我们就可以控制对象的创建过程,避免创建出不一致或不符合业务规则的对象。

相关文章:

辅助构造函数相关学习以及php实现

https://mp.weixin.qq.com/s/J9hgLTxYi7ZJdFVG2VszQg 对这个文章进行摘要生成 ### 总体概要 文章阐述了在对象创建过程中&#xff0c;辅助构造函数&#xff08;或称为“多个”构造函数&#xff09;的重要性&#xff0c;它们为代码增加了功能性逻辑&#xff0c;并允许根据需求调…...

Linux中nginx.conf如何配置【搬代码】

Nginx 是一个独立的软件。 它是一款高性能的 Web 服务器、反向代理服务器和负载均衡器等&#xff0c;具有强大的功能和广泛的应用场景。它通常需要单独进行安装和配置来发挥其作用。 下载网址&#xff1a;http://nginx.org/en/download.html nginx.conf写法&#xff1a; #配置…...

Django REST framework序列化器详解:普通序列化器与模型序列化器的选择与运用

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff…...

红队内网攻防渗透:内网渗透之内网对抗:隧道技术篇防火墙组策略ICMPDNSSMB协议出网判断C2上线解决方案

红队内网攻防渗透 1. 内网隧道技术1.1 学隧道前先搞清楚的知识1.2 常用的隧道技术1.3 判断协议出网的命令1.4 C2上线-开防火墙入站只80&出站只放ICMP1.4.1 icmp隧道上线CS后门1.4.1 icmp隧道上线MSF后门1.5 C2上线-开防火墙入站只80&出站只放DNS1.5.1 DNS隧道上线CS后门…...

【Autoware】Autoware.universe安装过程与问题记录

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Autoware.universe安装过程与问题记录。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下…...

JavaScript的学习之旅之基本数据类型

目录 一、字面量&#xff08;常量&#xff09;和变量 二、标识符 三、数据类型 1.String类型 2.Number类型 四、布尔值类型 五、Null和Undefined类型 一、字面量&#xff08;常量&#xff09;和变量 字面量&#xff1a;不可变的数据&#xff0c;一般位于等式的右边 变量&…...

oracle开放某些视图给特定用户,查询报视图不存在问题

以sysdba身份登录到Oracle数据库。 创建新用户。例如&#xff0c;创建一个名为new_user的用户&#xff0c;密码为password&#xff1a; CREATE USER new_user IDENTIFIED BY password;为新用户分配表空间和临时表空间。例如&#xff0c;将表空间users和临时表空间temp分配给新…...

es 更新索引mapping和setting

1.关闭索引 curl -X POST "localhost:9200/your_index_name/_close"2.修改setting 配置 无法更新一些默认数据,按照需求构建&#xff0c;我这边是构建增加了分词器 "settings": {"index": {"creation_date": "1718850346547…...

广告联盟流量变现app开发

广告联盟流量变现App的开发是一个涉及多个方面的综合性项目。以下是一个简要的开发流程和相关考虑因素&#xff1a; 市场分析与定位&#xff1a; 首先&#xff0c;需要对目标用户群体进行深入研究&#xff0c;了解他们的需求和偏好1。分析当前市场上的竞争对手和流行的广告模式…...

【Python高级编程】pickle`文件处理:序列化与反序列化

使用pickle模块可以在Python中方便地序列化和反序列化Python对象。以下是一个例子&#xff0c;展示了如何处理pickle文件&#xff0c;包括如何保存数据到pickle文件和从pickle文件加载数据。假设我们有一些数据需要保存并在之后加载。 示例代码 保存数据到 pickle 文件 impo…...

如何在 Linux 上安装 Docker Desktop

如何在 Linux 上安装 Docker Desktop Docker 是一个用于开发、部署和运行应用程序的开放平台。Docker Desktop 是 Docker 在 macOS 和 Windows 上的官方客户端&#xff0c;现在也支持 Linux 系统。本文将详细介绍如何在 Linux 上安装 Docker Desktop。 系统要求 在开始安装之…...

勒索病毒猖狂,请提前做好安全防护,德迅卫士保护你的安全

随着互联网的飞速发展&#xff0c;网络安全问题日益凸显。其中&#xff0c;勒索病毒作为一种极具危害性的网络安全威胁&#xff0c;已经引起了广泛关注。为了帮助大家更好地预防和应对勒索病毒攻击&#xff0c;我们特地为您精心准备了这份超实用的勒索病毒自救预防指南。让我们…...

Pycharm怎么默认终端连接远程服务器

因为经常需要从宿舍到学校内通勤&#xff0c;期间所有连接都会中断&#xff0c;所以每次开SSH特别麻烦&#xff0c;每次终端自动切换到本地&#xff1a; 每次都得点一下Start SSH Session 想要默认终端连接远程服务器&#xff0c;需要点File->Setting->Tools->SSH T…...

CTFHUB-SSRF-端口扫描

已经提示我们需要扫描8000~9000的端口 ?urlhttp://127.0.0.1:8000/flag.php 访问用burp抓包爆破 通过Burp扫描8000-9000端口开放的web服务&#xff0c;发现8718开放web服务...

日期工具类:获取 当前周 | 上一周 | 下一周 的第一天(周一)和最后一天(周天)

问题背景 获取 当前周 | 上一周 | 下一周 的第一天(周一)和最后一天(周天)。 例如: 输入:2024-6-21, current 输出:{"firstDay": "2024-6-17","lastDay": "2024-6-23"}输入:2024-6-21, last 输出:{"firstDay": …...

大数据学习-Hadoop

介绍 是 Apache 的顶级开源项目&#xff0c;一个分布式框架&#xff0c;主要功能&#xff1a; 分布式大数据存储——HDFS 组件分布式大数据计算——MapReduce 组件分布式资源调度——YARN 组件 可以通过它来构建集群&#xff0c;完成大数据的存储和计算 学习起来相对简单&…...

visualbox搭建linux环境双网卡配置

文章目录 1. 双网卡模式简介2. 网络模式配置2.1 virtualBox说明2.2 host-only网络模式配置2.3 NAT网络模式配置 3. 虚拟主机网络设置3.1 网卡一设置3.2 网卡二设置 4. 网卡配置5. ssh访问 本篇的目的是为了搭建本地的linux测试环境用。 1. 双网卡模式简介 双网卡网络模式简介 …...

一分钟了解Galaxybase银河图数据库先锋版升级功能!

Galaxybase 银河图数据库是一款创邻科技自主研发的商用图数据库&#xff0c;具有高性能、高可用、企业级安全等特性&#xff0c;支持大规模数据查询实时返回&#xff0c;快速挖掘关联关系&#xff0c;发现深层商业洞见&#xff0c;可广泛应用于金融、能源、电信、政企等行业中的…...

C++并发之协程实例(二)(计算斐波那契序列)

目录 1 协程2 实例-计算斐波那契序列2.1 斐波那契序列2.2 代码 3 运行 1 协程 协程(Coroutines)是一个可以挂起执行以便稍后恢复的函数。协程是无堆栈的&#xff1a;它们通过返回到调用方来暂停执行&#xff0c;并且恢复执行所需的数据与堆栈分开存储。这允许异步执行的顺序代码…...

云邮件推送服务如何配置?有哪些优势特点?

云邮件推送的性能怎么优化&#xff1f;如何选择邮件推送服务&#xff1f; 云邮件推送服务是一种基于云计算的邮件发送解决方案&#xff0c;能够帮助企业和个人高效地发送大规模邮件。AokSend将详细介绍如何配置云邮件推送服务&#xff0c;以便你能够充分利用其优势。 云邮件推…...

QT 数值型坐标轴有那些?(QValueAxis)

在Qt中&#xff0c;QValueAxis类用于表示数值型坐标轴&#xff0c;它本身没有直接的子类&#xff0c;但它是从QAbstractAxis这个抽象类继承而来的。QAbstractAxis是定义坐标轴属性和行为的基类&#xff0c;而QValueAxis则在此基础上提供了针对数值数据的具体实现。 Qt的图表模…...

《数字图像处理-OpenCV/Python》第16章:图像的特征描述

《数字图像处理-OpenCV/Python》第16章&#xff1a;图像的特征描述 本书京东 优惠购书链接 https://item.jd.com/14098452.html 本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html 第16章&#xff1a;图像的特征描述 特征通常是针对图像中的目标或…...

React的服务器端渲染(SSR)和客户端渲染(CSR)有什么区别?

React的服务器端渲染&#xff08;SSR&#xff09;和客户端渲染&#xff08;CSR&#xff09;是两种不同的页面渲染方式&#xff0c;它们各自有不同的特点和适用场景&#xff1a; 服务器端渲染&#xff08;SSR&#xff09; 页面渲染: 页面在服务器上生成&#xff0c;然后将完整的…...

安全生产第一位,靠谱的漏油监测系统有哪些?

漏油监测系统&#xff0c;一般是由漏油绳、漏油控制器、监控云平台组成&#xff0c;用于实时检测油库、油罐、加油站、输油管道、油类化工厂等场所是否发生漏油事故。在这些地方一旦发生漏油&#xff0c;就极可能引发爆炸&#xff0c;损害到人员及财产安全。而一套靠谱的漏油监…...

基于C#、Visual Studio 2017以及.NET Framework 4.5的Log4Net使用教程

在使用Log4Net记录日志时&#xff0c;以下是一个基于C#、Visual Studio 2017以及.NET Framework 4.5的详细步骤教程。这个教程适合初学者&#xff0c;会从添加Log4Net库、配置日志、编写日志记录代码等方面进行说明。 步骤1&#xff1a;安装Log4Net 通过NuGet安装 打开您的Vi…...

C# —— 构造函数

什么是构造函数 构造函数: 一般在函数为类的属性初始值的作用&#xff0c;构造函数的名称类名 在类里面定义构造函数 方法名和类名同名 不能带返回值类型 void/非void 不能有 // 创建一个构造函数 class People {public string Name { get; set; }public int Age { get; set;…...

HTML5的新属性

pattern&#xff1a;用于指定输入字段的正则表达式模式。在提交表单前&#xff0c;输入将验证是否符合指定的模式。 pattern 属性是 HTML5 中用于表单验证的一个属性&#xff0c;它用于指定一个正则表达式&#xff0c;以验证输入字段中的值是否符合特定的模式。该属性通常与 &l…...

[C语言] 常用排序算法

冒泡排序 思路&#xff1a; 从小到大&#xff0c;找到集合中最小的放在最左边&#xff0c;在剩下的集合中找到最小的放在最左边以此类推。如何找到最小的&#xff1f;&#xff08;假定左边第一个数就是最小的&#xff0c;让它依次和它右边的比较&#xff0c;如果右边的比它还小…...

【前端vue3】TypeScrip-interface(接口)和对象类型

对象类型 定义对象需要用到interface&#xff08;接口&#xff09;&#xff0c;主要用来约束数据的类型满足格式 定义方式如下&#xff1a; interface Person {name: string;age: number; }如对象中与接口中的属性不一致会报错&#xff0c;必须保持一致 例如如下&#xff1a…...

神经网络 torch.nn---nn.RNN()

torch.nn - PyTorch中文文档 (pytorch-cn.readthedocs.io) RNN — PyTorch 2.3 documentation torch.nn---nn.RNN() nn.RNN(input_sizeinput_x,hidden_sizehidden_num,num_layers1,nonlinearitytanh, #默认tanhbiasTrue, #默认是Truebatch_firstFalse,dropout0,bidirection…...

西安网站建设winkuo/新闻发布平台有哪些

vuejs - the component is a fragment instance http://vuejs.org/guide/components.html#Fragment-Instance 转载于:https://www.cnblogs.com/wancy86/p/5627176.html...

网站建设定金合同范本/成人培训机构

2019独角兽企业重金招聘Python工程师标准>>> 参考资料 1、Jmeter性能测试 入门 2、Jmeter教程 简单的压力测试 转载于:https://my.oschina.net/Howard2016/blog/1552715...

沈阳网站建设公司怎么样/百度推广是什么工作

内容简介 本书⾯向希望了解深度学习&#xff0c;特别是对实际使⽤深度学习感兴趣的⼤学⽣、⼯程师和研究⼈员。本书并不要求你有任何深度学习或者机器学习的背景知识&#xff0c;我们将从头开始解释每⼀个概念。虽然深度学习技术与应⽤的阐述涉及了数学和编程&#xff0c;但你只…...

北京西站疫情/软文怎么写吸引人

1.使用场景 场景还是比较多的 例如常见的登录、做一些功能发送失败的ajax都可以用弹框提示 2.提示组件 message.vue <template><div class"xtx-message" :style"style[type]"><!-- 上面绑定的是样式 --><!-- 不同提示图标会变 -…...

高碑店住房和城乡建设局网站/seo产品优化推广

原文&#xff1a;http://coolketang.com/staticCoding/5a990cf30b61607bf6cdcfdc.html 1. 本节课将为您演示如何使用不同设备类型的模拟器。双击打开之前创建的项目模板。 2. 点击[编译并运行]按钮&#xff0c;打开模拟器并预览当前项目。 3. 当您向苹果提交应用时&#xff0c;…...

应该双网站/可以看任何网站的浏览器

我的测试环境为redhat7.2 kernel-2.4.7-10 首先下载软件包 http://www.mirrors.wiretapped.net/security/network-intrusion-detection/lids/download/下可找到相应kernel的lids包 由于我的kernel是2.4.7所以先下相应的lids包lids-1.0.12-2.4.20.tar.gz 也要对应2.4.20 1.下载…...