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

xad*_*ict 3 php variables function optional-arguments

我正在使用elses class,而且这个人定义了一个带有五个参数的函数.

在Sentry.php中:

function checkLogin($user = '',$pass = '',$group = 10,$goodRedirect = '',$badRedirect = '')
Run Code Online (Sandbox Code Playgroud)

如果填写了所有五个字段,则会导致登录过程.

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

在加载哨兵的页面中:

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

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

但是,这不起作用,并且有一个非常明显的原因:php手册指出:

请注意,使用默认参数时,任何默认值都应位于任何非默认参数的右侧; 否则,事情将无法按预期工作.

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

我该如何使用这样的功能?:

checkLogin(2)
Run Code Online (Sandbox Code Playgroud)

Myt*_*ica 9

默认参数是PHP处理缺少重载函数的方法.在Java中,您可以这样写:

public void login(String username)
public void login(String username, String password)
Run Code Online (Sandbox Code Playgroud)

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

function login($username, $password = '')
Run Code Online (Sandbox Code Playgroud)

这样$ username是必需的,$ password是可选的.虽然这可能很方便,但并非总是如此.在您的示例中,有一个参数日志,它们都是可选的.一个干净的解决方案是使1个功能完成工作并添加"方便"方法,使界面更清洁.

所以添加:

function checkLoginGroup($group = 10) {
  $this->checkLogin('', '', $group);
}
Run Code Online (Sandbox Code Playgroud)

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

$theSentry->checkLoginGroup(2);
Run Code Online (Sandbox Code Playgroud)

将提供的方法设为私有(或根据您的需要进行保护)并创建公共"方便"方法甚至更加简洁,以便您可以隐藏实现细节.

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