优化你的PHP代码,从现在做起

前言

按需设计网站可以根据自己的需求进行定制,成都网站建设、成都网站制作构思过程中功能建设理应排到主要部位公司成都网站建设、成都网站制作的运用实际效果公司网站制作网站建立与制做的实际意义

我一生的文章都会放在这里,我的博客,我希望每一行代码,每一段文字都能帮助你。https://github.com/CrazyCodes...

大家好,我是CrazyCodes ,今天我们不聊工具、规范等等等等的辅助,就聊一下该如何写一段“好”的代码,本文以我的职业生涯碰到的代码为例,如有出入请在评论区提出异议,谢谢。

搜索功能

搜索很常见,复杂的搜索大多出行在后台,举个栗子,大概需求是这样的。

这是一个后台用户列表的搜索功能

搜索条件 可否并行 是否必填
用户名 可以 否
手机号码 可以 否
是否已认证 可以 是
用户性别 可以 否
最近登录时间 可以 否
账户余额 可以 否

初学者代码

看到这些例子你是否不由的一颤,又要开始造轮子的是不是?

以原生的例子为例,开始你可能会这样写(以下为伪代码) :

 
 
 
  1. if (IS_POST) { 
  2.     $like = ''; 
  3.     if (isset($_POST['username'])) { 
  4.         $username = $_POST['username']; 
  5.         $like .= "username like '%" . $username . "%' and "; 
  6.     } 
  7.     if (isset($_POST['phone'])) { 
  8.         $phone = $_POST['phone']; 
  9.         $like .= "phone like '%" . $phone . "%' and"; 
  10.     } 
  11.     if ($_POST['is_auth']) { 
  12.         $isAuth = $_POST['is_auth']; 
  13.         $like .= "is_auth like '%" . $isAuth . "%' and"; 
  14.     } 
  15.     if ($_POST['sex']) { 
  16.         $sex = $_POST['sex']; 
  17.         $like .= "sex like '%" . $sex . "%' and"; 
  18.     } 
  19.     if ($_POST['time']) { 
  20.         $time = $_POST['time']; 
  21.         $like .= "time like '%" . $time . "%' and"; 
  22.     } 
  23.     if ($_POST['wallet']) { 
  24.         $wallet = $_POST['wallet']; 
  25.         $like .= "wallet like '%" . $wallet . "%' and"; 
  26.     } 
  27.     $like = rtrim($like, 'and'); 
  28.     $sql = "SELECT * FROM `user` WHERE {$like}"; 
  29. } else { 
  30.     return view('user'); 
  31. } 

封装

恩...,还不错,结构清晰,传统的初学者条型代码,接下来我们先封装一下几块代码。

 
 
 
  1. function post($param) 
  2. { 
  3.     return isset($_POST[$param]) ? $_POST[$param] : null; 
  4. } 
  5. if (IS_POST) { 
  6.     $like = ''; 
  7.     if (post('username')) { 
  8.         $username = post('username'); 
  9.         $like .= "username like '%" . $username . "%' and "; 
  10.     } 
  11.     if (post('phone')) { 
  12.         $phone = post('phone'); 
  13.         $like .= "phone like '%" . $phone . "%' and"; 
  14.     } 
  15.     if (post('is_auth')) { 
  16.         $isAuth = post('is_auth'); 
  17.         $like .= "is_auth like '%" . $isAuth . "%' and"; 
  18.     } 
  19.     if (post('sex')) { 
  20.         $sex = post('sex'); 
  21.         $like .= "sex like '%" . $sex . "%' and"; 
  22.     } 
  23.     if (post('time')) { 
  24.         $time = post('time'); 
  25.         $like .= "time like '%" . $time . "%' and"; 
  26.     } 
  27.     if (post('wallet')) { 
  28.         $wallet = post('wallet'); 
  29.         $like .= "wallet like '%" . $wallet . "%' and"; 
  30.     } 
  31.     $like = rtrim($like, 'and'); 
  32.     $sql = "SELECT * FROM `user` WHERE {$like}"; 
  33. } else { 
  34.     return view('user'); 
  35. } 

适当使用迭代

恩,至少我们可以自由控制post方法了,但是这类过程化代码维护性太低,我们再改进下:

 
 
 
  1. function post($param) 
  2. { 
  3.     return isset($_POST[$param]) ? $_POST[$param] : false; 
  4. } 
  5. function postAll() 
  6. { 
  7.     return $_POST; 
  8. } 
  9. if (IS_POST) { 
  10.     $like = ''; 
  11.     foreach (postAll() as $key => $value) { 
  12.         if (post($key)) { 
  13.             $like .= "{$key} like '%{$value}%' and"; 
  14.         } 
  15.     } 
  16.     $like = rtrim($like, 'and'); 
  17.     $sql = "SELECT * FROM `user` WHERE {$like}"; 
  18. } else { 
  19.     return view('user'); 
  20. } 

面向对象

加个迭代代码看起来还算是整洁了点,作为PHP程序员,写代码不面向对象不靠谱,把class加上。

 
 
 
  1. function request($param = null) 
  2. { 
  3.     return new Request($param); 
  4. } 
  5. class Request 
  6. { 
  7.     public function __construct(string $param = null)
  8.     { 
  9.         return isset($_POST[$param]) ? $_POST[$param] : false; 
  10.     } 
  11.     public function all() 
  12.     { 
  13.         return $_POST; 
  14.     } 
  15. } 
  16. class User 
  17. { 
  18.     public function index() 
  19.     { 
  20.         if (IS_POST) { 
  21.             $like = ''; 
  22.             foreach (request()->all() as $key => $value) { 
  23.                 if (request($key)) { 
  24.                     $like .= "{$key} like '%{$value}%' and"; 
  25.                 } 
  26.             } 
  27.             $like = rtrim($like, 'and'); 
  28.             $sql = "SELECT * FROM `user` WHERE {$like}"; 
  29.         } else { 
  30.             return view('user'); 
  31.         } 
  32.     } 
  33. } 

对User的改造

我们在对User的类进行改造,做一些判断及筛选。

 
 
 
  1. function request($param = null) 
  2. { 
  3.     return new Request($param); 
  4. } 
  5. class Request 
  6. { 
  7.     public function __construct(string $param = null) 
  8.     { 
  9.         return isset($_POST[$param]) ? $_POST[$param] : false; 
  10.     } 
  11.     public function all() 
  12.     { 
  13.         return $_POST; 
  14.     } 
  15. } 
  16. class User 
  17. { 
  18.     public $request = [ 
  19.         'username', 
  20.         'phone', 
  21.         'is_auth', 
  22.         'sex', 
  23.         'time', 
  24.         'wallet' 
  25.     ]; 
  26.     public function index() 
  27.     { 
  28.         if (IS_POST) { 
  29.             $like = ''; 
  30.             foreach (request()->all() as $key => $value) { 
  31.                 if (in_array($key, $this->request) && request($key)) { 
  32.                     $like .= sprintf("%s like %s and", $key, $value); 
  33.                 } 
  34.             } 
  35.             $like = rtrim($like, 'and'); 
  36.             $sql = "SELECT * FROM `user` WHERE {$like}";
  37.         } else { 
  38.             return view('user'); 
  39.         } 
  40.     } 
  41. }

这就差不多了,对比真是的代码可能还相差甚远,我写这篇文章的目的不是教会你如何写代码,是想说明编码不是一次性的,应经过多次修改,使代码具有可维护性,扩展性等等的,各种“性”。


新闻标题:优化你的PHP代码,从现在做起
分享链接:http://kmvly.com/article/cdsossg.html