【问题标题】:Best Practices Passing In A Limited Amount Of Variable Values Into Method将有限数量的变量值传递给方法的最佳实践
【发布时间】:2012-10-05 11:03:59
【问题描述】:

我正在为联系人管理创建一个类,我很好奇是否有人有任何创意可以传递选项以使某些列可通过 MySQL 中的ORDER BY 进行排序。

有 5 列。 ID、名字、姓氏、电话号码、电子邮件。

所有这些都需要是可排序的升序和降序。显而易见的答案就是传入一个字符串,例如“firstname DESC”——但似乎有点难以打开,并且想让类更具限制性。

有什么想法吗?

【问题讨论】:

  • 听起来应该在客户端用 js 完成,比每次都检索所有数据要快得多。
  • 这是不可能的。数据集将完全很大。 order by 需要是 MySQL 查询的一部分。
  • 多大?我用 60k 行表来做这个,分页是 js 的一部分。但否则只需将标题转换为链接并在 url 中传递 var
  • 它可能有数百万行。无论如何,即使是60k也太多了。我不能依赖我们的客户浏览器可能无法处理它。它必须在服务器端完成。
  • 好的,现在你知道限定未来的问题了:-0

标签: php


【解决方案1】:

类型最安全的方法是使用只能保存某些值的对象:

function getUser(UserSortOption $sortOrder) {
    ...
    $sql .= $sortOrder->getField() . $sortOrder->getDirection();
    ...
}

getUser(new UserSortOption(UserSortOption::FIRSTNAME, UserSortOption::DESC));

为您提供严格类型和枚举的所有优势。虽然必须为每个函数参数定义、测试和包含一个单独的类,但这可能有点过头了。

否则,您必须检查函数内部:

function getUser(array $sort) {
    $sortField = key($sort);
    $sortDirection = current($sort);

    if (!in_array($sortField, array('Firstname', ...))) {
        throw new InvalidArgumentException("Invalid value $sortField for sort parameter");
    }

    ...
}

getUser(array('Firstname' => 'desc'));

【讨论】:

  • 谢谢,选项 2 看起来像我们将要使用的。
猜你喜欢
  • 2012-02-10
  • 2012-07-27
  • 2013-05-13
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多