问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何写高质量的PHP代码

发布网友 发布时间:2022-04-28 11:09

我来回答

2个回答

懂视网 时间:2022-04-28 15:31

前言

经常会有人问

  • 目录如何设计比较好?
  • 代码如何分布好?
  • 怎么写一个可维护的项目?
  • “烂”项目我也没少写,以下是参考互联网各大佬的文章总结及个人开发经验而来.

    Controller

    clipboard.png

    Controller顾名思义是控制器,在入门PHP的时候,就知道Controller代表MVC中的C层,MVC本身的概念就代码分离,教你如何如何将业务分开,但面临着业务的不断发展,代码的复杂度也随之提高,功能与功能之间的链接错综复杂,最后你的MVC就变成了下图,所以仅仅依托MVC的设计思想已经无法支撑不断发展的业务。

    现在我们将Controller的任务和能力重新定义,控制器仅仅控制Http Reqeust的请求,这样就符合了SOLID 单一功能原则.

    clipboard.png

    直接将业务代码写在Controller中,会使得代码及其臃肿,不易于维护和扩展

    <?php
    	namespace AppHttpController;
    
    	class UserController extends Controller{
    
    		public function register(Request $request){			$user = new User();			$user->username = $request->input('username');			$user->password = $request->input('password');			$result = $user->save();			return $result;
    		}
    
    	}复制代码

    这时就应该思考如何分离业务代码,我们引入Service的概念

    Service

    Service本身译为服务

  • 将外部方法,公共方法注入到Service
  • 将Service注入到控制器
  • clipboard.png

    像上图这样

    UserController

    <?php
    	namespace AppHttpController;
    
    	class UserController extends Controller{
    
    		public $request;
    		
    		protected $userService;
    		
    		public function __construct(Request $request, UserService $userService)
    		{			$this->request = $request;			
    			$this->userService = $userService;
    		}
    		
    		public function register()
    		{
    			//... validation			return $this->userService->register ($this->request->all());
    		}
    
    	}复制代码

    UserService

    <?php
    	namespace AppService;
    
     class UserService{
     
     public function register($data)
    		{  $username = $data['username'];  $password = $data['password'];  
    			$password = encrypt ($password);			
    			$user = new User();			$user->username = $username;			$user->password = $password;			$result = $user->save();			return $result;
    		}
    
     }复制代码

    到现在为止,我们至少将业务与请求彻底分开了。但还是不如人意,如果把所有的业务及CURD全部写在Service中,那只不过是将Controller的臃肿转移到了Service,那Service就没有什么存在意义了。 所以我们需要继续分割Service,将对数据库的R操作独立出来,因为CUD的操作基本是一贯不变的,而R操作根据业务的复杂度则变的多姿多彩。所以独立R操作。这个时候我们引用Repository的概念。

    Repository

    我们使用Repository辅助Model,将相关的查询逻辑封装到不同的repository中,方便逻辑代码的维护

  • 符合SOLID的单一原则
  • 符合SOLID的依赖反转
  • clipboard.png

    UserController

    <?php
    	namespace AppHttpController;
    
    	class UserController extends Controller{
    
    		public $request;
    		
    		protected $userService;
    		
    		public function __construct(Request $request, UserService $userService)
    		{			$this->request = $request;			
    			$this->userService = $userService;
    		}
    		
    		public function getUserInfo()
    		{
    			//... validation			return $this->userService->getUserInfo ($this->request->all());
    		}
    
    	}复制代码

    UserService

    <?php
    	namespace AppService;
    
     class UserService{
     public $userRepository;
     
     public function __construct(UserRepository $userRepository){  $this->userRepository = $userRepository;
     }
     public function getUserInfo()
    		{  return $this->userRepository->getUserInfo($data);
    		}
    
     }复制代码

    UserRepository

    <?php
    	namespace AppRepository;
    
     class UserRepository{
     
     public function getUserInfo($data)
    		{  $userId = $data['user_id'];  $result = User::where('id',$userId)->first();			
    			return $result;
    		}
    
     }复制代码

    解决了R的问题,有人就问了,难道因为CUD比较统一简单就可以放在一起了吗?答案是NO,我们引用一个新的名词Action。

    Action

    这是看了@Charlie_Jade的文章才学到的

    独立每个操作文件,例如CreateUser,DeleteUser,UpdateUser

  • 符合SOLID的单一原则
  • clipboard.png

    UserController

    <?php
    	namespace AppHttpController;
    
    	class UserController extends Controller{
    
    		public $request;
    		
    		protected $userService;
    		
    		public function __construct(Request $request, UserService $userService)
    		{			$this->request = $request;			
    			$this->userService = $userService;
    		}
    		
     public function register(){
      //... validation  return $this->userService->register($this->request->all());
     }
    
    		public function getUserInfo()
    		{			return $this->userService->getUserInfo ($this->request->all());
    		}
    
    	}复制代码

    UserService

    <?php
    	namespace AppService;
    
     class UserService{
     
     public function getUserInfo(UserRepository $userRepository)
    		{  return $this->userRepository->getUserInfo($data);
    		}
    
     public function register(){  $result = (new CreateUser())->execute($this->request->all());  
      return $result;
     }
    
     }复制代码

    UserRepository

    <?php
    	namespace AppRepository;
    
     class UserRepository{
     
     public function getUserInfo($data)
    		{  $userId = $data['user_id'];  $result = User::where('id',$userId)->first();			
    			return $result;
    		}
    
     }复制代码

    CreateUser

    <?php
    
    	namespace AppAction;
    	
    	use AppModelMember;
    	
    	class CreateUser extends CreateUserWallet
    	{
    		public function execute(array $data)
    		{			$models  = new Member();			$models->tel = $data['tel'];			$models->password = $data['password'];			$result  = $models->save ();				
    			return $result;
    		}
    	}复制代码

    以上代码逻辑见下图

    clipboard.png

    除模版(V)等HTML,JS等,还需要一些其他的规则,或者说是方式去实现一些代码的解耦合,以下不再提供代码案例。

    Common

    译为公共的,常用的,再部分开发中,你可能需要一些公共的方法(并非公共的类,例如邮件发送等,用他并不合适),比如查询用户余额,查询用户是否注册或者是否在线,生成订单号等。使用Common更要简单。他更像一个公共函数库的样子

    clipboard.png

    Event

    不关心执行结果时可以选使用,不过Event的Listen也是提供了队列。

    Exception

    不要将你的所有错误提示都使用Return返回,很多时候你的返回未必是你的返回

    致谢

    感谢各位同学看完这篇文章,如果你有新的想法欢迎在评论区讨论.

    推荐教程:《php教程》

    热心网友 时间:2022-04-28 12:39

    可读性: 个人觉得这个尤其重要, 你的变量名, 方法名能不能让人见名知义. 命名是否统一, 不散漫.
    可扩展性: 可扩展的程序的生命力才是强大的, 高质量的代码必须具有高可扩展性的特点. php本身就是可以被扩展的, 扩展性非常好, 非常方便, 这个是众所周知的. 最好的编辑器vim也是拥有无敌的扩展性.
    安全性: 这个重要性不言而喻, 没有安全, 再优雅的代码也没有任何意义.
    耦合度: 程序的逻辑不应过分耦合, 使得牵一发而动全身. 低耦合度可以使得代码的可重用性非常高.
    运行效率: 天下武功, 唯快不破. 一个优秀的算法可以让程序的运行效率快几个数量级. 数据结构+算法=程序在今天依然不是一句空话.
    如何写出好的 PHP 代码?

    通过使用PHP的特殊功能和函数,如:mysql_real_escape_string等等,你可以编写出安全的代码。6- 避免短标签 把所有用到短标签的替换成完整的PHP标签。7- 使用单引号代替双引号 字符串始终使用单引号代替双引号,以避免PHP搜索字符串内的变量导致的性能下降。8- 转义字符串输出 使用ENT_QUOTES作参数传递...

    php网站公司介绍文本代码怎么写

    1、在网站目录下新建一个叫indexphp的文件,并在里面编写这样的代码。echoHelloWorld。2、后用浏览器访问http:localhostindexphp这个网址,网页上就会显示HelloWorld这句话。3、上面的代码是将phpPHP代码的开始标签和标签分开两行写了,中间写的echo那句代码就是PHP代码,也可以全部写在一行,但是要有空格,...

    代码怎么编写(代码怎么做)

    首先需要确定开发语言,比如c,c++,java,python,php,.net等,当开发语言确定后就可以根据语法规则通过代码编辑器开始编写代码了。 软件开发学习是一个非常不错的选择,就目前软件开发而言java专业仍是比较吃香的一个专业,就业也是很不错的。 这专业会学习以下语言:C,JAVA,PHP,PYTHON,MYSQL,JAVASCRIPT另外就是各个语言的...

    PHP点赞和踩功能的怎么实现,代码怎么写

    3. 服务器端,使用PHP来接收前端发送的请求,并进行相应的处理。这可能涉及到数据库操作来记录用户的点赞或踩的行为。```php // 伪代码,表示接收AJAX请求并处理 if ($_SERVER['REQUEST_METHOD'] === 'POST' &amp;&amp; isset($_POST['action'])) { action = $_POST['action'];if ($action ==...

    根据你的经验谈谈写php程序需要注意哪些问题?

    38、当你需要时,你总能把代码分解成方法。39、尽量采用大量的PHP内置函数。40、如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。41、评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。42、...

    用PHP写上传资源的代码是上传大文件,例如300M的文件,再不改php.ini设置...

    可以,利用php里面的函数ini_set(),ini_set参数格式为ini_set($var,$value),$var是你要设置的配置选项,$value是你要修改的值。

    php代码怎么写001到999的循环

    &lt;?phpfor($i = 1 ;$i&lt;1000 ; $i++){if(strlen($i) == 1){echo "00".$i." ";}if(strlen($i) == 2){echo "0".$i." ";}if(strlen($i) == 3){echo $i." ";}}?&gt;显示为结果为您说的 001——999

    php面向对象编程书写代码规范

    b) 名字的首字母使用大写 c) 不要使用下划线(’_')d) interface接口最好使用大写字母I,并以Interface结尾 例如:class NameOneTwo class Name interface IExampleInterface ()方法命名 a) 使用大写字母作为词的分隔,其他的字母均使用小写 b) 名字的首字母使用大写,声明为 “private” 或 “protected...

    PHP查询代码怎么写?

    代码如下 &lt;?php $conn = @mysql_connect("localhost","root","root") or die ("database error"); mysql_select_db("DB",$conn); if (isset($_POST['submit'])){ $num=$_POST['num']; $sql="SELECT num FROM TEST WHERE num=$num"; $tt=mysql_query($sql,$conn...

    php文件怎么写(php文件用什么软件编写)

    php写文件1、首先声明一个本地没有的文件。然后查看wampserver本地环境。是没有这个文件的。紧接着使用file_put_contents()来创建这个文件,并写上这个文件存贮。查看wampserver本地环境。出现了这个文件。2、phpstudy根目录无法写入php文件解决方法如下。打开文件指针,创建文件,检查文件是否被创建且可写...

    如何衡量代码质量 如何提高代码质量 写一篇关于高质量的写人的作文 什么是高质量的代码 编写高质量代码 高质量代码的保证方法 高质量的代码具备哪些特征 高质量代码的三要素 代码质量高的开源库
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    做了好乱的梦,求解! ae缺少p1效果是要装什么插件? ...荣耀》中“网络诊断”居然可以测定酒店有无摄像头,这是好事吗? 七叶一枝花花苞里面的红米是什么 q了是什么意思? ...Q就可以,格式也没错,也只几十K,别人发给我都可以,哪里出问题了... 显的么说友Q在微 ?Q上新示怎让在说我空里动间的态不更好博 诺诗兰户外品牌怎么样 新隋唐英雄传张卫健萧妃是刘小庆吗 红尖椒和朝天椒介绍!红尖椒和朝天椒哪个辣? 行政执法局协管 公安协警辅警笔试综合基础知识 谁有“交通行政执法人员业务考试题库4 ”,发给我 ,谢谢 wzf6146@sina.com 2011年福建省行政执法资格考试综合法律知识试题 河南省行政执法人员公共法律知识考试合格线多少分 急,求2010年苏州城管考行政执法的考试试题 网上怎么申请支付宝 怎么弄支付宝账号啊 支付宝怎样注册账号的?是要身份证吗?没有银行卡可以进行正常网购么? 支付宝账号怎么注册?怎么申请支付宝个人账户 笔记本电脑怎么开不了热点了 急急急!笔记本电脑无法开热点了,怎么办? 笔记本开不了热点怎么解决 我的笔记本开不了热点,这该怎么解决? 腾讯时光是腾讯的软件吗?他们客服关于腾讯时光的问题回答吗? 枸杞原浆什么成分能美白? 腾讯时光视频误发布给朋友圈怎么办?能撤回吗?? 腾讯时光为什么要写sD卡 生育保险交了七个月、怀孕了、公司没辞退、生完孩子后去公司上班可以报销多少_百度问一问 沁园春 辛弃疾 叠嶂西驰运用了哪些典故 沁园春 词牌的意思,来源 新买的保鲜盒套装太紧,拔不出来,怎么办呢? 求正确的蜂蜜泡柠檬片的做法~~~ 蜂蜜和干柠檬水怎么泡 养虾怎么养 如何写出好的 PHP 代码? 泡沫箱发豆芽需在箱底打漏洞排水吗?需要盖子盖住吗? 怎么种黑豆芽??? 泡沫箱种菜还要钻眼吗? 昨晚做梦,梦见被两只老虎咬代表什么? 梦见两只大老虎向咬我但没出血后来被两个人给吓着了打老虎 的是针状焦,石墨电极,跟石墨烯有什么关系 梦见两只老虎,我以为它会过来咬我,但是我摸摸它们的头,就很温顺。请问代表什么?本人女。 石墨电极是不是石墨烯 梦见自己老公被两只老虎咬死吃是什么意识 梦见家里厨房进了两只老虎的还和我要吃的 石墨烯电池有什么原理 纽扣电池半电池 锂过量什么意思,石墨电极面积为什么需要和锂片面积一致,且与电极厚度有什么关系 石墨烯电池的原理是什么? 石墨烯电池的电极材料与电池容量的关系 急性非淋巴细胞白血病的介绍