设计模式 - php中如何解决函数参数列表过长问题
迷茫
迷茫 2017-04-10 14:22:24
[PHP讨论组]

想写个灵活拼接sql语句的函数,把select,from,where,group by,order by,limit这些都作为参数传递。但是如果每一个都作为独立的参数传递,调用函数的时候,就会受到参数顺序的限制,简单的sql也可能写好几个无用空参数。如果要是通过构造一个对象来传递所有参数,参数列表短了,也不受顺序限制了,但是每次调用函数前又都要构造对象,也挺麻烦,感觉用起来不自然。有什么好的方法解决吗?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(4)
天蓬老师

有时候,我会做一个类似这样的封装,提供给楼主参考……

//伪代码
class Sql {
  protected $fields, $table, $where;
  function __construct($table) {
    $this->table = $table; 
  }
  function select($fields){
    $this->fields = $fields;
    return $this;
  }
  function where($where) {
    $this->where = $where;
    return $this;
  }
  function __toString(){
    return "select {$this->fields} from {$this->table} where {$this->where}";
  }
  static function from($table) {
    return new self($table);
  }
}

//用法
echo Sql::from('table')->select('*')->where('1=1');
//输出: select * from table where 1=1;

当然,实际用到的封装会比这个复杂一些……

PHPz

不知道有多少人做过这种"灵活"拼SQL的东西,我想他们最后都会发现,SQL太灵活,语言太死板,拼来拼去也不会让人满意。

一个可行的实践是将SQL语句集中起来。实际上每次去找数据库的SQL语句中变量并不多,完全可以事先写好SQL语句,分配个id,简单包装一下,在调用的时候给出参数。

这样做的好处至少有这两个:
1. 可以保证sql语句经过测试,用上了该用的索引
2. 参数化查询可以避免SQL注入攻击

PHPz

我个人比较喜欢把这些可变的参数用一个数组($options)传入...然后在函数内部判断传入了这个参数没...不知道我是不是答非所问...

PHPz
  1. 针对SQL而言,建议直接拼SQL或找个框架吧,比如Yii框架的就支持下面这样的写法:(是不是简单多了呢?)
$rows = (new \yii\db\Query())
    ->select(['id', 'email'])
    ->from('user')
    ->where(['last_name' => 'Smith'])
    ->limit(10)
    ->all();
  1. 针对问题标题本身——“php中如何解决函数参数列表过长问题”——PHP有个很强大的array,可以用它来传参数呀(变相的命名参数):
function foo($params){
    $params = array_merge(array(
            'select' => 'default selector',
            'where' => 'default where',
            // ...
       ), $params);

    // do something with $params...

}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号