как использовать функцию с необязательным аргументом, определенным как третий - PullRequest
3 голосов
/ 07 августа 2009

Я использую другой класс 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, это должно позволить человеку просматривать страницу. </p>

Однако, это не работает и по очень очевидной причине: руководство php гласит:

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

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

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

checkLogin(2)

Ответы [ 5 ]

9 голосов
/ 07 августа 2009

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

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);

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

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

1 голос
/ 07 августа 2009

В дополнение к Отличный ответ от Mythicas , я просто хочу указать на другой способ работы со множеством необязательных аргументов: массивы.

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

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

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

1 голос
/ 07 августа 2009

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

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

checkLogin('', '', 20);

По-моему, используя это вместо этого:

checkLogin(null, null, 20);

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

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


Другие решения подразумевают рефакторинг функции,

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

0 голосов
/ 07 августа 2009

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

0 голосов
/ 07 августа 2009
checkLogin(NULL,NULL,2);

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

...