3

我正在使用其他人的课程,而那个人已经定义了一个带有五个参数的函数。

在 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)
4

5 回答 5

9

默认参数是 PHP 处理缺少重载函数的方式。在 Java 中你可以这样写:

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

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

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

这种方式 $username 是强制性的, $password 是可选的。虽然这可能很方便,但并非总是如此。在您的示例中,有一个参数日志,它们都是可选的。一个干净的解决方案是制作一个可以完成工作的函数并添加“方便”方法以使界面更干净。

所以添加:

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

它只是调用已经存在的函数,但它允许更清晰的接口,只需调用:

$theSentry->checkLoginGroup(2);

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

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

于 2009-08-06T22:50:04.453 回答
1

改变参数的顺序是可能的......但是什么时候你需要另一个参数是“更多可选”或“更少可选”?你会再改变那个顺序吗?
而且,有了它,对函数的每次调用?

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

checkLogin('', '', 20);

在我看来,使用这个而不是那个:

checkLogin(null, null, 20);

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

使用NULL,阅读您的代码的人员将不得不检查函数的代码内部是否NULL以特殊方式处理(它可以,毕竟!);有人很难理解这是您传递默认值的方式...因为它们不是默认值^^


其他解决方案将意味着重构功能,

无论哪种方式,您都将失去 IDE 向您显示函数正在等待的参数的能力;这很糟糕:-(
而且你也会失去phpdoc ...

于 2009-08-06T22:51:35.667 回答
1

除了Mythica 的优秀答案之外,我只想指出另一种处理大量可选参数的方法:数组。

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

checkLogin(array('user' => 'x', 'group' => 9));

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

于 2009-08-06T23:46:49.597 回答
0

最简单的方法就是更改参数的顺序,以便 $group 排在第一位。

于 2009-08-06T22:35:40.550 回答
-1
checkLogin(NULL,NULL,2);

但老实说糟糕的编码风格。

于 2009-08-06T22:32:04.223 回答