Php 在为MVC应用程序设计api时,使用数组而不是参数列表是否更好?

Php 在为MVC应用程序设计api时,使用数组而不是参数列表是否更好?,php,model-view-controller,api,kohana,Php,Model View Controller,Api,Kohana,在编写CRUD MVC应用程序时,您是否建议在为业务层(模型)编写api时使用数组而不是长(甚至短)参数列表 例如,你会建议哪一个: 1 // Posts::getPosts(20, 0, $category, 'date_added'); static function getPosts($limit = NULL, $offset = NULL, Model_Category $category = NULL, $sort_by = NULL); 2 // Posts::getPosts(

在编写CRUD MVC应用程序时,您是否建议在为业务层(模型)编写api时使用数组而不是长(甚至短)参数列表

例如,你会建议哪一个:

1

// Posts::getPosts(20, 0, $category, 'date_added');
static function getPosts($limit = NULL, $offset = NULL, Model_Category $category = NULL, $sort_by = NULL);
2

// Posts::getPosts(array('limit' => 20, 'offset' => 0, 'category' => $category, 'sort_by' => 'date_added'));
static function getPosts(array $options = NULL);`
1看起来更干净,更不容易出现bug,但2看起来更灵活(可以在不更改api的情况下轻松添加/切换参数)。我只是想找个理由


谢谢

仅使用一个数组,试图调用您的方法的人不知道它需要哪些参数。
他的IDE也帮不上忙

=>他必须去阅读文档——这需要时间


另一方面,对于第一个解决方案,只要查看方法的声明(我的IDE在键入方法名称时确实会显示),我就知道它需要什么参数


我同意您的第二个解决方案(命名参数数组)更加灵活


但是,特别是当只有几个参数时,我倾向于选择第一个——这正是我写这篇文章的原因。

仅使用一个数组,试图调用您的方法的人不知道它需要哪些参数。
他的IDE也帮不上忙

=>他必须去阅读文档——这需要时间


另一方面,对于第一个解决方案,只要查看方法的声明(我的IDE在键入方法名称时确实会显示),我就知道它需要什么参数


我同意您的第二个解决方案(命名参数数组)更加灵活


但是,特别是当只有几个参数时,我倾向于选择第一个参数——这正是我写的原因。

这可能取决于您需要什么。您使用的参数是否具有逻辑顺序?一个不适用于另一个吗?并不是每件事都是这样或那样的


由于本案的性质,单独辩论可能是最佳途径。不过,我建议它提供更有用的默认值。

这可能取决于您需要什么。您使用的参数是否具有逻辑顺序?一个不适用于另一个吗?并不是每件事都是这样或那样的


由于本案的性质,单独辩论可能是最佳途径。不过,我建议它提供更有用的默认值。

我遵循以下经验法则:

如果

  • 有5个以上的参数
  • 参数没有逻辑顺序
  • 参数之间没有明确的逻辑依赖关系
    和/或
  • 大多数参数都是可选的
那么,使用数组来模拟关键字参数可能是个好主意。否则,只需使用标准参数即可

也可以考虑使用A来做复杂的方法调用。 编辑:我该怎么处理这个

public static function search(
  $keywords,
  $limit = NULL,
  $offset = NULL,
  Model_Post_Type $type = NULL,
  Model_Category $category = NULL
)
好的,对于参数数组(在支持它们的语言中也称为关键字参数,如Python),我个人的偏好是这样做:

public static function search($keywords, $options = array()) {
  $default_options = array(
    'limit' => NULL,
    'offset' => NULL,
    'post_type' =>  NULL,
    'category' => NULL
  );
  extract(array_merge($default_options,$options));
  // search logic, using $keywords, $limit, $offset, $post_type, $category
}
这给您带来了一些好处:

  • $options
    中的任何内容都是完全可选的。任何必需的参数都应该是参数
  • 允许您完全控制这些选项的默认值,甚至允许在数组初始值设定项中使用复杂的表达式
  • 允许您以后添加新的(可选)搜索选项,同时与现有代码保持向后兼容
  • extract()
    将键值对转换为变量值对,因此该方法的其余部分完全不知道您使用的是参数数组而不是普通参数

    • 我遵循这条经验法则:

      如果

      • 有5个以上的参数
      • 参数没有逻辑顺序
      • 参数之间没有明确的逻辑依赖关系
        和/或
      • 大多数参数都是可选的
      那么,使用数组来模拟关键字参数可能是个好主意。否则,只需使用标准参数即可

      也可以考虑使用A来做复杂的方法调用。 编辑:我该怎么处理这个

      public static function search(
        $keywords,
        $limit = NULL,
        $offset = NULL,
        Model_Post_Type $type = NULL,
        Model_Category $category = NULL
      )
      
      好的,对于参数数组(在支持它们的语言中也称为关键字参数,如Python),我个人的偏好是这样做:

      public static function search($keywords, $options = array()) {
        $default_options = array(
          'limit' => NULL,
          'offset' => NULL,
          'post_type' =>  NULL,
          'category' => NULL
        );
        extract(array_merge($default_options,$options));
        // search logic, using $keywords, $limit, $offset, $post_type, $category
      }
      
      这给您带来了一些好处:

      • $options
        中的任何内容都是完全可选的。任何必需的参数都应该是参数
      • 允许您完全控制这些选项的默认值,甚至允许在数组初始值设定项中使用复杂的表达式
      • 允许您以后添加新的(可选)搜索选项,同时与现有代码保持向后兼容
      • extract()
        将键值对转换为变量值对,因此该方法的其余部分完全不知道您使用的是参数数组而不是普通参数

      公共静态函数搜索($keywords,$limit=NULL,$offset=NULL,Model\u Post\u Type$Type=NULL,Model\u Category$Category=NULL)
      请记住,将来可能会有其他参数来对结果进行排序等。
      公共静态函数搜索($keywords,$limit=NULL,$offset=NULL,Model_Post_Type$Type=NULL,Model_Category$Category=NULL)
      请记住,将来可能会有其他参数来对结果进行排序等。