sql is null优化_优化你的PHP代码,从现在做起

29c123d483ccce54beba8ed248f8a99d.gif

本文原载于SegmentFault专栏“Grace Development”

作者:CrazyCodes

整理编辑:SegmentFault

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

搜索功能

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

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

94b04b18af7c7d3c88c31434bc15e0c9.png

初学者代码

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

if (IS_POST) {    $like = '';    if (isset($_POST['username'])) {        $username = $_POST['username'];        $like .= "username like '%" . $username . "%' and ";    }    if (isset($_POST['phone'])) {        $phone = $_POST['phone'];        $like .= "phone like '%" . $phone . "%' and";    }    if ($_POST['is_auth']) {        $isAuth = $_POST['is_auth'];        $like .= "is_auth like '%" . $isAuth . "%' and";    }    if ($_POST['sex']) {        $sex = $_POST['sex'];        $like .= "sex like '%" . $sex . "%' and";    }    if ($_POST['time']) {        $time = $_POST['time'];        $like .= "time like '%" . $time . "%' and";    }    if ($_POST['wallet']) {        $wallet = $_POST['wallet'];        $like .= "wallet like '%" . $wallet . "%' and";    }    $like = rtrim($like, 'and');    $sql = "SELECT * FROM `user` WHERE {$like}";} else {    return view('user');}

封装

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

function post($param){    return isset($_POST[$param]) ? $_POST[$param] : null;}if (IS_POST) {    $like = '';    if (post('username')) {        $username = post('username');        $like .= "username like '%" . $username . "%' and ";    }    if (post('phone')) {        $phone = post('phone');        $like .= "phone like '%" . $phone . "%' and";    }    if (post('is_auth')) {        $isAuth = post('is_auth');        $like .= "is_auth like '%" . $isAuth . "%' and";    }    if (post('sex')) {        $sex = post('sex');        $like .= "sex like '%" . $sex . "%' and";    }    if (post('time')) {        $time = post('time');        $like .= "time like '%" . $time . "%' and";    }    if (post('wallet')) {        $wallet = post('wallet');        $like .= "wallet like '%" . $wallet . "%' and";    }    $like = rtrim($like, 'and');    $sql = "SELECT * FROM `user` WHERE {$like}";} else {    return view('user');}

适当使用迭代

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

function post($param){    return isset($_POST[$param]) ? $_POST[$param] : false;}function postAll(){    return $_POST;}if (IS_POST) {    $like = '';    foreach (postAll() as $key => $value) {        if (post($key)) {            $like .= "{$key} like '%{$value}%' and";        }    }    $like = rtrim($like, 'and');    $sql = "SELECT * FROM `user` WHERE {$like}";} else {    return view('user');}

面向对象

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

function request($param = null){    return new Request($param);}class Request{    public function __construct(string $param = null){        return isset($_POST[$param]) ? $_POST[$param] : false;    }    public function all(){        return $_POST;    }}class User{    public function index(){        if (IS_POST) {            $like = '';            foreach (request()->all() as $key => $value) {                if (request($key)) {                    $like .= "{$key} like '%{$value}%' and";                }            }            $like = rtrim($like, 'and');            $sql = "SELECT * FROM `user` WHERE {$like}";        } else {            return view('user');        }    }}

对User的改造

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

function request($param = null){    return new Request($param);}class Request{    public function __construct(string $param = null){        return isset($_POST[$param]) ? $_POST[$param] : false;    }    public function all(){        return $_POST;    }}class User{    public $request = [        'username',        'phone',        'is_auth',        'sex',        'time',        'wallet'    ];    public function index(){        if (IS_POST) {            $like = '';            foreach (request()->all() as $key => $value) {                if (in_array($key, $this->request) && request($key)) {                    $like .= sprintf("%s like %s and", $key, $value);                }            }            $like = rtrim($like, 'and');            $sql = "SELECT * FROM `user` WHERE {$like}";        } else {            return view('user');        }    }}

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


欢迎关注 SegmentFault 微信公众号 :)

c053d8ad418466482cb5299483030397.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值