2009-08-06 5 views
3

Я использую класс 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(); } 

, который по умолчанию должна вести себя как таковой, что она проверяет, является ли $ группы аргумент < = 10 (по умолчанию). В этой ситуации это должно быть два. Если у пользователя установлен групповой переменный < = 2, это должно позволить человеку просмотреть страницу.

Однако, это не работает, и по очень очевидной причине: Руководство по PHP состояний:

Обратите внимание, что при использовании по умолчанию аргументов, либо по умолчанию должно быть правой сторона любого не- default аргументы; в противном случае вещи не будут работать должным образом.

Поэтому код, согласно phpbuilder.com должны иметь не факультативного ($variable = default_something) поля, чтобы заполнить с помощью вызова функции, и это, безусловно, не должно быть определенно в качестве третьего из пяти аргументов.

Как я могу использовать функцию, как это ?:

checkLogin(2) 

ответ

9

По умолчанию аргументы являются способом PHP справиться с отсутствием перегруженных функций. В Java вы можете написать это:

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

В PHP вы должны решить, как это:

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

Таким образом, $ имя пользователя является обязательным и $ пароль не является обязательным. Хотя это может быть удобно, это не всегда. В вашем примере есть журнал аргументов, и все они являются необязательными. Чистым решением для этого было бы сделать 1 функцию, которая выполняет эту работу, и добавить методы «удобства», чтобы сделать интерфейс чище.

Так добавить:

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

Это просто вызывает функцию, которая уже существует, но она позволяет более чистый интерфейс, просто позвоните:

$theSentry->checkLoginGroup(2); 

Это даже аккуратнее, чтобы прилагаемый методу частному (или защищены, в зависимости от ваших потребностей) и создавать общедоступные методы «convience», чтобы вы могли скрыть детали реализации.

Однако, если вы не можете или не хотите менять исходный класс, возможно, вы сможете создать подкласс.

-1
checkLogin(NULL,NULL,2); 

но честно плохой стиль кодирования.

+0

так меняет порядок аргументов - лучший выбор? – xaddict

+0

Я бы сказал, что метод checkLogin без имени пользователя и пароля не может проверить много :) так что первые два параметра (имя пользователя/пароль) должны быть обязательными). , но это верно только в этом конкретном случае checkLogin. – Rufinus

+2

Предоставление NULL в качестве аргументов не приводит к тому, что функция использует значение аргумента по умолчанию, поэтому в этом случае $ user и $ pass являются NULL, а не '', что, вероятно, не имеет никакого значения в этом случае. – danamlund

0

Самый простой способ - просто изменить порядок аргументов, чтобы первая группа была первой.

1

Изменение порядка аргументов является возможность ... Но что за время вам потребуется еще один аргумент, чтобы быть «более optionnal» или «менее optionnal»? Вы измените этот порядок еще раз?
И, с этим, каждый вызов, который был сделан для функции?

Чтобы передать только третий аргумент, учитывая объявление вашей функции, единственный метод, который я вижу, - это дать три первых аргумента ... Передача значения по умолчанию (которое вам нужно знать, конечно же - просто смотреть на это декларации, для этого) для первых двух:

checkLogin('', '', 20); 

на мой взгляд, используя это вместо того, чтобы один:

checkLogin(null, null, 20); 

имеет преимущество быть явным: кто-то смотрит на Объявление функции ion немедленно заметит, что вы используете значения по умолчанию для первых двух параметров.

NULL Использование, в personn чтения кода придется проверить внутри кода функция, чтобы увидеть, если NULL обрабатывается специальным образом (он мог, Afterall!); это не было бы так просто, для кого-то, чтобы понять, что это ваш способ передачи значения по умолчанию ... Поскольку они не являются значениями по умолчанию ^^


Других решения будут означать рефакторинг функции,

  • либо передать только один массив в качестве параметра (с его клавиши не требуется по коду)
  • OT использованием Variable-length argument lists

В любом случае, вы потеряете способность вашей среды IDE показать вам параметры, которые ожидает функция; и это плохо :-(
И вы также потеряете PHPDoc ...

+0

NULL не совпадает с значениями по умолчанию. – hobodave

+0

Согласен; поэтому я сказал, что он должен использовать '' (значения по умолчанию), а не "NULL" –

1

В дополнение к 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)); 

Это, по сути, полностью исключает необязательный/требуемый синтаксис аргументов PHP, а вместо этого выполняет внутреннюю обработку этих вещей.Преимущество состоит в том, что вы избегаете описанной вами проблемы и делаете вызов функции чрезвычайно читаемым. Проблема в том, что это делает функцию более сложной, и вы не можете воспользоваться PHP, проверяя наличие аргументов для вас.