更好地解决变量参数函数?

时间:2010-12-30 18:36:24

标签: php

这就是我现在所拥有的:

 function getAlbum(){
     $args = func_get_args();

     if(!(count($args) % 2) || count($args) == 1) {
         trigger_error('Argument count must be an odd number and greater than one.');
         return false;
     }

     $q = new Query("album_manager");
     $q->select($args[0]);
     unset($args[0]);
     call_user_func_array(array($q, "where"),$args);
     $q->limit(1);
     return send_back_as_array($q);
 }

如果您致电getAlbum('*','cid',1),则会获得cid=1的所有属性 如果您致电getAlbum('cid, anchor', 'cid',1),则会获得anchorcid cid=1

它运行正常,但我担心当有人调试代码时,他们可能会误将,cid之间的anchor误认为是参数分隔符而感到困惑。

有没有人有更优雅的解决方案?我只是感兴趣。

我考虑将其更改为接受getAlbum('cid','anchor','where:','cid',1)的位置,但我不确定会更好。

这就是我改为:

function getAlbum(){
    // argument one is a comma separated value or an array of what is requested.
    // the rest of the args must be an even number (odd number of args overall)
    // ever even argument is a selector and every odd is a condition 'selector = condition' in query
    // Examples:
    //      getAlbum('*','cid',1);   <-  Select all attributes from album where cid = 1
    //      getAlbum('cid','anchor','test','name','This is a test'); <- select cid from album where anchor = 'test' and 'name' = 'This is a test'
    //      getAlbum(array('cid','anchor'),'test','name'); select cid and anchor where 'test'='name'
    //      getAlbum('cid, anchor','cid',1); select cid and anchor where cid=1
    $args = func_get_args();
    if(!(count($args) % 2) || count($args) == 1) {
        trigger_error('Argument count must be an odd number and greater than one.');
        return false;
    }
    $q = new Query("album_manager");
    $q->select((is_array($args[0]) ? implode(", ",$args[0]) : $args[0]));
    unset($args[0]);
    call_user_func_array(array($q, "where"),$args);
    $q->limit(1);
    $array = send_back_as_array($q);
    if(count($array) != 1) return false;
    else return $array;
}

4 个答案:

答案 0 :(得分:3)

一个数组怎么样,并用逗号插入其元素?

$q->select(is_array($args[0]) ? implode(', ', $args[0]) : $args[0]);

致电代码:

getAlbum(array('cid', 'anchor'), 'cid', 1);

编辑:那么听起来就好了,因为select()方法会自动处理数组。

答案 1 :(得分:1)

您可以执行以下操作:

$album = Album::select('cid', 'anchor')->where('cid', 1)->findOne();
$albums = Album::select('cid', 'anchor')->find();

select函数可以返回某种查询构建器的新实例。它的每个成员函数都将返回$this,以便您可以将调用链接在一起。如果查询构建器实现了迭代器,那么最终的find()方法可以是可选的,因为在大多数情况下你可以这样做:

foreach(Album::select('cid', 'anchor') as $album) {}

有几种不同的方法可以像这样链接在一起;我不是主张将上述风格作为最佳版本,而只是简单说明其中一种方式。

如果你不是在考虑进行如此彻底的改变,那么你所做的事情就不会那么明显了。几种可能性:您可以将选定的字段组合成单个字符串或数组,或者您可以使用命名数组参数(但这样会匆忙得到详细信息)。

答案 2 :(得分:1)

根据函数的使用方式和方式,尝试将数组传递给函数。在函数内部确保如果需要设置默认值(如果未传递变量)则恢复正常。即:

function getAlbum($options) {
  $fields = array_key_exists('fields', $options) ? $options['fields'] : '';
  $where = array_key_exists('where', $options) ? $options['where'] : array();

  [do stuff]

  return $data;
}

$options = array('fields' => 'cid,anchor',
                 'where' => array('cid' => 1)
);

这样,随着函数的发展,您可以传递其他值,而不必担心稍后更改参数的结构/顺序。

答案 3 :(得分:0)

我想,我更喜欢getAlbum(array('cid','anchor'),'cid',1)。这看起来很清楚,根据用例你可以写:

getAlbum(array(
    'cid',
    'anchor'
),'cid',1)