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

灰太狼 2021-01-29 18:27 797阅读 0赞

前言

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

搜索功能

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

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

20200909132512826.png

初学者代码

看到这些例子你是否不由的一颤,又要开始造轮子的是不是? 以原生的例子为例,开始你可能会这样写(以下为伪代码)

  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. }

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

发表评论

表情:
评论列表 (有 0 条评论,797人围观)

还没有评论,来说两句吧...

相关阅读

    相关 小事

          看了视频自己深有体会,原来自己周围的环境是如此的脏乱,老师的话也正是点醒了我自己,自己本身也是一个大学生了,还在提高班学习了这么长的时间,连自己的卫生都搞不好,感到

    相关 优化PHP代码,现在

    前言 今天我们不聊工具、规范等等等等的辅助,就聊一下该如何写一段“好”的代码,本文以我的职业生涯碰到的代码为例,如有出入请在评论区提出异议,谢谢。 搜索功能 搜索很常见...