代码之家  ›  专栏  ›  技术社区  ›  xaddict

如何使用定义为第三个非可选参数的函数

  •  3
  • xaddict  · 技术社区  · 15 年前

    我使用的是someone elses类,那个人用五个参数定义了一个函数。

    在Sentry.php:

    function checkLogin($user = '',$pass = '',$group = 10,$goodRedirect = '',$badRedirect = '')
    

    如果这五个字段都已填写,则会导致登录过程。

    现在,在他解释如何使用这个的页面上,有一个片段,根据php.net,这个片段是没有意义的。

    在加载岗哨的页面中:

    require_once('../system/Sentry.php');
    $theSentry = new Sentry();
    if(!$theSentry->checkLogin(2)){ header("Location: login.php"); die(); }
    

    默认情况下,它将检查$group参数是否为<=10(默认)。在这种情况下,应该是两个。如果选中的用户的组变量为<=2,则应允许用户查看页面。

    但是,这不起作用,原因很明显:PHP手册说明:

    请注意,使用默认值时 参数,任何默认值都应为 任何违约行为的右侧 争论;否则,事情不会 按预期工作。

    因此,根据phpbuilder.com,代码应该没有可选的( $variable = default_something )用对函数的调用填充的字段,它绝对不应该被定义为五个参数中的第三个。

    如何使用这种函数?:

    checkLogin(2)
    
    5 回复  |  直到 15 年前
        1
  •  9
  •   Mythica    15 年前

    默认参数是PHP处理缺少重载函数的方法。在爪哇,你可以这样写:

    public void login(String username)
    public void login(String username, String password)
    

    在PHP中,您必须这样解决它:

    function login($username, $password = '')
    

    这样,$username是必需的,$password是可选的。虽然这可能很方便,但并非总是如此。在您的示例中,有一个参数日志,它们都是可选的。为此,一个干净的解决方案是使1个完成工作的函数,并添加“便利”方法以使接口更干净。

    因此添加:

    function checkLoginGroup($group = 10) {
      $this->checkLogin('', '', $group);
    }
    

    它只调用已经存在的函数,但它允许更干净的接口,只调用:

    $theSentry->checkLoginGroup(2);
    

    将所提供的方法设为私有(或受保护,具体取决于您的需要)并创建公共的“方便”方法,这样您就可以隐藏实现细节。

    但是,如果您不能或不想更改原始类,则可以创建子类。

        2
  •  1
  •   Pascal MARTIN    15 年前

    改变论点的顺序是可能的…但现在你还需要另一个理由 更多选择 “或” 较少选择的 “?你能再换一次吗?
    有了它,对函数的每一个调用?

    为了只传递第三个参数,考虑到函数的声明,我看到的唯一方法是给出前三个参数…传递默认值 (当然,你必须知道——看看它的声明) 对于前两个:

    checkLogin('', '', 20);
    

    在我看来,用这个代替那个:

    checkLogin(null, null, 20);
    

    具有显式的优点:查看函数声明的人会立即注意到前两个参数使用的是默认值。

    使用 NULL ,读取代码的人员必须检查函数代码的内部,以查看 无效的 以特殊方式处理 (毕竟可以!) 如果有人知道这是你传递默认值的方法,那就不容易了…因为它们不是默认值^^


    其他解决方案意味着重构函数,

    不管怎样,您都将失去IDE向您显示函数等待参数的能力;这很糟糕:-(
    你也会失去博士学位…

        3
  •  1
  •   Community Mr_and_Mrs_D    7 年前

    除了 Mythicas excellent answer 我只想指出另一种处理大量可选参数的方法:数组。

    function checkLogin($args) {
        $defaults = array('user' => null, 'pass' => null, 'group' => null, ...);
        $args = array_merge($defaults, $args);
        ...
    }
    
    checkLogin(array('user' => 'x', 'group' => 9));
    

    这基本上完全绕过了phps可选/必需的参数语法,而自定义在内部处理这些事情。它的优点是避免了您描述的问题,并使函数调用非常可读。问题是它使函数更加复杂,并且您不能利用PHP检查参数的存在。

        4
  •  0
  •   da5id    15 年前

    最简单的方法就是改变参数的顺序,使$group成为第一个。

        5
  •  -1
  •   Rufinus    15 年前
    checkLogin(NULL,NULL,2);
    

    但实际上,糟糕的编码风格。