PHP浅谈代码架构之解耦。本文主要介绍了PHP解耦的三重境界以及服务容器的相关知识。具有很好的参考价值。希望对大家有所帮助。
在完成整个软件项目开发的过程中,有时需要多人合作,有时也可以自己独立完成,不管是哪一种,随着代码量上升,写着写着就“失控”了,渐渐“丑陋接口,肮脏实现”,项目维护成本和难度上升,到了难以维持的程度,只有重构或者重新开发。
第一重境界
假设场景:我们需要写一个处理类,能够同时操作会话,数据库和文件系统。我们或许会这么写。
境界特征:可以运行,但是严重耦合
class DB{ public function DB($arg1,$arg2){ echo 'constructed!'.PHP_EOL; } } class FileSystem{ public function FileSystem($arg1,$arg2){ echo 'constructed!'.PHP_EOL; } } class Session{ public function Session($arg1,$arg2){ echo 'constructed!'.PHP_EOL; } } class Writer{ public function Write(){ $db=new DB(1,2); $filesystem=new FileSystem(3,4); $session=new Session(5,6); } } $writer=new Writer(); $writer->write();
写法缺点:
1.在公有函数中构造对象,一旦涉及到如数据库参数的变动,修改会有很大的工作量
2.负责设计Writer类的人员需要对DB等类的各种API要熟悉
有没有办法降低耦合度?
第二重境界(参数依赖)
假设场景:数据库地址因为客户不同,需要经常更换,调用到DB的类很多(假如有几十个),希望即使更改了数据库地址,也不用去修改这些类的代码。
class DB{ public function DB($arg1,$arg2){ echo 'constructed!'.PHP_EOL; } } class FileSystem{ public function FileSystem($arg1,$arg2){ echo 'constructed!'.PHP_EOL; } } class Session{ public function Session($arg1,$arg2){ echo 'constructed!'.PHP_EOL; } } class Writer{ protected $_db; protected $_filesystem; protected $_session; public function Set($db,$filesystem,$session){ $this->_db=$db; $this->_filesystem=$filesystem; $this->_session=$session; } public function Write(){ } } $db=new DB(1,2); $filesystem=new FileSystem(3,4); $session=new Session(5,6); $writer=new Writer(); $writer->Set($db,$filesystem,$session); $writer->write();
虽然把DB类的构造移到了客户端,一旦涉及修改,工作量大大降低,但是新问题来了:为了创建一个Writer类,我们需要先创建好DB类,FileSystem类等,这对负责涉及Writer类的人来说,要求是很高的,他需要看很多其他类文档,一个个创建(可能还需要初始化),然后才能创建出他要的writer变量。
所以,我们希望,能有一种更好的写法,使得写Writer类的人,用一种更加快捷的接口,就能创建和调用他要的类,甚至连参数都不用填。
第三重境界(IOC容器)
经过前两重境界,我们希望能新增以下这些好处:
1.希望DB类,Session类,FileSystem类“拿来即用”,不用每次繁琐的初始化,比如写$db=new DB(arg1,arg2);这类语句。
2.希望DB等类型的对象是“全局”,在整个程序运行期间,随时可以调用。
3.调用DB等类型的程序员不用知道这个类太多的细节,甚至可以用一个字符串的别名来创建这样一个对象。
能够实现以上目标的就是IOC容器,可以把IOC容器简单的看成一个全局变量,并用关联数组把字符串和构造函数做绑定。
我们先实现一个容器类
class Container{ public $bindings; public function bind($abstract,$concrete){ $this->bindings[$abstract]=$concrete; } public function make($abstract,$parameters=[]){ return call_user_func_array($this->bindings[$abstract],$parameters); } }
服务注册(绑定)
$container=new Container(); $container->bind('db',function($arg1,$arg2){ return new DB($arg1,$arg2); }); $container->bind('session',function($arg1,$arg2){ return new Session($arg1,$arg2); }); $container->bind('fs',function($arg1,$arg2){ return new FileSystem($arg1,$arg2); });
容器依赖
class Writer{ protected $_db; protected $_filesystem; protected $_session; protected $container; public function Writer(Container $container){ $this->_db=$container->make('db',[1,2]); $this->_filesystem=$container->make('session',[3,4]); $this->_session=$container->make('fs',[5,6]); } } $writer=new Writer($container);
相关推荐:
Yii2 两个模块(module)间的数据需要相互调用,如何设计才能最大程度降低耦合性?
接口抽象类 PHP中用接口、抽象类、普通基类实现“面向接口编程”与“耦合方法”简述
以上是PHP浅谈代码架构之解耦的详细内容。更多信息请关注PHP中文网其他相关文章!

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增强codemodocultion,可验证性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

选择DependencyInjection(DI)用于大型应用,ServiceLocator适合小型项目或原型。1)DI通过构造函数注入依赖,提高代码的测试性和模块化。2)ServiceLocator通过中心注册获取服务,方便但可能导致代码耦合度增加。

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)启用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替换loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

phpemailvalidation invoLvesthreesteps:1)格式化进行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)

tomakephpapplicationsfaster,关注台词:1)useopcodeCachingLikeLikeLikeLikeLikePachetoStorePreciledScompiledScriptbyTecode.2)MinimimiedAtabaseSqueriSegrieSqueriSegeriSybysequeryCachingandeffeftExting.3)Leveragephp7 leveragephp7 leveragephp7 leveragephpphp7功能forbettercodeefficy.4)

到ImprovephPapplicationspeed,关注台词:1)启用opcodeCachingwithapCutoredUcescriptexecutiontime.2)实现databasequerycachingusingpdotominiminimizedatabasehits.3)usehttp/2tomultiplexrequlexrequestsandredececonnection.4 limitsclection.4.4

依赖注入(DI)通过显式传递依赖关系,显着提升了PHP代码的可测试性。 1)DI解耦类与具体实现,使测试和维护更灵活。 2)三种类型中,构造函数注入明确表达依赖,保持状态一致。 3)使用DI容器管理复杂依赖,提升代码质量和开发效率。

databasequeryOptimizationinphpinvolVolVOLVESEVERSEVERSTRATEMIESOENHANCEPERANCE.1)SELECTONLYNLYNESSERSAYCOLUMNSTORMONTOUMTOUNSOUDSATATATATATATATATATATRANSFER.3)


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

WebStorm Mac版
好用的JavaScript开发工具

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境