PHP функция - игнорировать некоторые параметры по умолчанию

Возможный дубликат:
Любой способ указать необязательные значения параметров в PHP?

просто случайно наткнулся на это.

Если у меня есть такая функция:

public function getSomething($orderBy='x', $direction = 'DESC', $limit=null){

//do something random

}

При вызове функции можно игнорировать первые два поля и оставить их по умолчанию, но указать 3-е.

Например:

$random = $this->my_model->getSomething(USE_DEFAULT, USE_DEFAULT, 10);

Я знаю, что могу передать 1-й и 2-й параметры, но все, что я спрашиваю, - это какое-то специальное ключевое слово, которое просто говорит, что используется значение по умолчанию.

Надеюсь, что это имеет смысл. это не проблема, просто любопытно.

Спасибо за прочтение

4 ответа

Решение

Вы должны сделать это самостоятельно. Ты можешь использовать null чтобы указать, что следует использовать значение по умолчанию:

public function getSomething($orderBy = null, $direction = null, $limit = null) {
    // fallbacks
    if ($orderBy === null) $orderBy = 'x';
    if ($direction === null) $direction = 'DESC';

    // do something random
}

Тогда пройдите null при вызове, чтобы указать, что вы хотите использовать значения по умолчанию:

$random = $this->my_model->getSomething(null, null, 10);

Другое возможное решение, которое я иногда использую, - это дополнительный параметр в самом конце списка параметров, содержащий все необязательные параметры:

public function foo($options = array()) {
    // merge with defaults
    $options = array_merge(array(
        'orderBy'   => 'x',
        'direction' => 'DESC',
        'limit'     => null
    ), $options);

    // do stuff
}

Таким образом, вам не нужно указывать все необязательные аргументы. array_merge() гарантирует, что вы всегда имеете дело с полным набором опций. Вы бы использовали это так:

$random = $this->my_model->foo(array('limit' => 10));

Кажется, что в данном конкретном случае нет обязательных параметров, но если вам нужен, просто добавьте их перед необязательными:

public function foo($someRequiredParameter, $someOtherRequiredParameter, $options = array()) {
    // ...
}

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

Ответ Неуловимого является лучшим в соответствии с вашим вопросом, но взгляните на цикломатическую сложность: http://en.wikipedia.org/wiki/Cyclomatic_complexity

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

Я не думаю, что PHP может сделать это. Лучшее из известных мне решений описано здесь: http://www.php.net/manual/en/functions.arguments.php

Вы не можете игнорировать параметры. Но вы можете сделать что-то вроде этого:

public function getSomething($limit=null){

return $this->getSomething('x','DESC',$limit);

}


public function getSomething($orderBy='x', $direction = 'DESC', $limit=null){

...

}

до встречи

Другие вопросы по тегам