PHP передает аргумент по умолчанию в функцию - PullRequest
9 голосов
/ 05 января 2011

У меня есть PHP-функция, например:

function($foo = 12345, $bar = false){}

Что я хочу сделать, так это вызвать эту функцию с передаваемым по умолчанию аргументом $ foo, но для $ bar установлено значение true, напримерболее или менее)

function(DEFAULT_VALUE, true);

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

Заранее спасибо!

Ответы [ 5 ]

10 голосов
/ 05 января 2011

Это изначально невозможно в PHP.Есть обходные пути, такие как использование массивов для передачи всех параметров вместо ряда аргументов, , но они имеют серьезные недостатки .

Лучший ручной обходной путь, который я могу придумать, - это определить константу с помощьюпроизвольное значение, которое не может столкнуться с реальным значением.Например, для параметра, который никогда не может быть -1:

define("DEFAULT_ARGUMENT", -1);

, и проверьте его:

function($foo = DEFAULT_ARGUMENT, $bar = false){}
3 голосов
/ 05 января 2011

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

function blah_foo($bar)
{
    blah(12345, $bar);
}

function blah($foo = 12345, $bar = false) { }
3 голосов
/ 05 января 2011

Обычный подход к этому состоит в том, что if (is_null($foo)) функция заменяет его значением по умолчанию.Используйте null, пустую строку и т. Д., Чтобы «пропустить» аргументы.Вот как это делают большинство встроенных функций PHP, которым нужно пропускать аргументы.

<?php
function($foo = null, $bar = false)
    {
    if (is_null($foo))
        {
        $foo = 12345;
        }
    }
?>
3 голосов
/ 05 января 2011

поставь их наоборот:

function($bar = false, $foo = 12345){}

function(true);
0 голосов
/ 27 октября 2011

я думаю, лучше отсортировать на основе аргумента, который наиболее часто изменяется, например, $bar, мы ставим его первым,

function foo( $bar = false, $foo = 12345){
// blah blah...
}

поэтому, когда вы хотите передать $bar в true и $foo в 12345, вы делаете это,

foo(true);
...