php中new与构造函数,php - 在构造函数中使用“ new”关键字 - SO中文参考 - www.soinside.com...

news/2024/10/29 7:22:32/

这实际上是依赖项注入背后的理论。

并不是说使用“ new”本身是一个坏主意。相反,通过实例化类内部的对象,您正在创建硬依赖性,如果不更改类本身就无法更改或切换出来。

它也违反了“编码到接口,而不是实现”的范式

示例:class Phone {

protected $network;

public function __construct() {

$this->network = new Verizon();

$this->network->distinctiveRing();

}

}

class Verizon {

public function call($number) {

....

}

public function distinctiveRing() {

}

}

现在,假设您有一天想创建ATT,TMobile和Sprint手机?当然,他们所有人都可以打电话,而且只要有电话号码就可以打电话。另外,电话班级不必关心运营商是谁,因为它的工作是方便输入号码-而不是实际建立网络连接,对吗?

因此,我们不必创建一个可以实例化另一个Sprint网络对象的新SprintPhone类,对吗?对。

那还有什么更好的方法?class Phone {

protected $network;

public function __construct(NetworkInterface $network) {

$this->network = $network;

}

}

interface NetworkInterface {

public function call($number);

}

class Verizon implements NetworkInterface {

...

}

class Sprint implements NetworkInterface {

...

}

现在,您可以说:$phone = new Phone(new Sprint())或$phone = new Phone(new Verizon())

还请注意,我们对distinctiveRing的调用已消失。为什么?好吧,因为我们不知道任何实现NetworkInterface的对象都必须支持独特的环。 但这很好,因为现在我们的Phone可以支持ANY Network,而无需更改代码。

如果要支持特殊振铃,则始终可以创建一个支持distinctiveRing方法的新接口。在Phone对象中,可以检查Network implements DistinctiveRingerInterface,如果是,则制作独特的戒指。但是,您不再需要使用这种方法来绑定特定的网络。更好的是,您被迫这样做,因为从一开始就采取了正确的方法。

而且,以后可以创建任何其他可行的网络。更重要的是,您的班级不再需要关心它所提供的哪种网络对象。它知道(因为它接收到一个实现NetworkInterface的对象),所以Network对象能够用call来创建$number。

这也往往会导致代码更好,关注点分离更好。

最后是测试。

在第一个示例中,如果您尝试测试Phone对象,它将在Verizon网络上进行呼叫。很糟,因为您正在运行单元测试,所以整天都被打来电话,对吧?对。

好,只需创建一个实现NetworkInterface的TestNetwork类,然后将其传递给您的电话对象。您的TestNetwork类可以在call方法中执行任何您想执行的操作-或不执行任何操作。

此外,您可以只使用PHPUnit创建一个模拟对象,并确保您的TestNetwork上的call方法实际上得到了调用。您以前无法执行此操作,因为Network已在Phone内部实例化。


http://www.ppmy.cn/news/969509.html

相关文章

计算机无法联网的原因和解决方案,上不了网络的原因分析及解决办法

很多时候上不了网络因为电脑网卡无法自动获取DNS地址导致,如何查看及设置电脑的IP地址、网关、DNS? 在遇到网络故障或一些别的情况,无法上网时时,电脑维修人员也会告诉你查看电脑的IP地址。那么如何查看及设置电脑的IP地址、网关、DNS呢?今天…

凡事预则立--求职

一、简介 1、求职一般分为5步 (1)笔试 (2)电话面熟 (3)面试 (4)签约 (5)违约 二、注意事项 (1)薪水(税前还是税…

机器学习--最小二乘法

补充: 一. 简介 最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法…

一个屌丝程序猿的人生(八十四)

次日。 清晨6点。 天刚蒙蒙亮,林萧便早早的从床上爬了起来。 虽说上次面试去过一次,对于路线和路上花费的时间,已经有了一定的经验,但因为是第一次到公司报道,林萧不敢有丝毫大意。 洗簌完以后,林萧没有立即…

数据库存储过程,触发器混个面熟

存储过程是一个可重用的代码模块,可以高效率地完成指定的操作,既可 以使用Transact-SQL语言编写存储过程,也可以使用CLR方式编写存储过程 1.存储过程包含三种:用户定义的存储过程,扩展的存储过程,系统存储…

java最后问面试官什么问题,大量教程

魔鬼面试官必问:ConcurrentHashMap 线程安全吗?但面对魔鬼面试官时,我们更在乎的是这些真的正确吗? 1 线程重用导致用户信息错乱生产环境中,有时获取到的用户信息是别人的。查看代码后 为方便观察问题,我们输出了这个Map一开始和最后的元素个数。 师兄大厂面试遇到面试官的Ka…

计算机网络参考模型及协议

目录 一、计算机网络概述 1.1计算机网络与通信 1.2计算机IP地址与Mac地址 1.3计算机网络相关术语 1.4计算机网络相关设备 1.5计算机网络分类 二、计算机网络分层 2.1计算机网络分层的必要性 三、OSI七层参考模型 3.1应用层 3.2表示层 3.3会话层 3.4传输层 3.5网络…

纪念成为博客专家

一、前言 是的,一直到现在都有点蒙蒙的。从上周六提交申请之后,一直没有消息,博主自己都放弃了。这是第四次申请,虽然申请了很多次,但内心一直有些打退堂鼓,觉得自己的技术水平并不到位,其他的专…