我知道可以使用可选参数,如下所示:
function doSomething($do, $something = "something") {
}
doSomething("do");
doSomething("do", "nothing");
但假设您有以下情况:
function doSomething($do, $something = "something", $or = "or", $nothing = "nothing") {
}
doSomething("do", $or=>"and", $nothing=>"something");
所以在上面一行中它会默认$something
为“某事”,即使我为其他一切设置了值。我知道这在.net中是可能的 - 我一直都在使用它。但如果可能的话,我需要在PHP中执行此操作。
有人能告诉我这是否可行?我正在改变我已经整合到Interspire购物车中的Omnistar联盟计划 - 所以我想保持一个功能正常工作,我不改变对该功能的调用的任何地方,但在一个地方(我正在扩展)我想要指定其他参数。我不想创建另一个函数,除非我绝对必须。
答案 0 :(得分:12)
不,在PHP中,写作时是不可能的。使用数组参数:
function doSomething($arguments = array()) {
// set defaults
$arguments = array_merge(array(
"argument" => "default value",
), $arguments);
var_dump($arguments);
}
使用示例:
doSomething(); // with all defaults, or:
doSomething(array("argument" => "other value"));
更改现有方法时:
//function doSomething($bar, $baz) {
function doSomething($bar, $baz, $arguments = array()) {
// $bar and $baz remain in place, old code works
}
答案 1 :(得分:3)
查看func_get_args:http://au2.php.net/manual/en/function.func-get-args.php
答案 2 :(得分:2)
PHP(5.3)目前不提供命名参数。
要解决此问题,您通常会看到一个接收参数array()
的函数,然后使用extract()
在局部变量中使用提供的参数或array_merge()
来默认它们。
您的原始示例如下所示:
$args = array('do' => 'do', 'or' => 'not', 'nothing' => 'something');
doSomething($args);
答案 3 :(得分:0)
PHP没有命名参数。您必须决定一种解决方法。
最常用的是数组参数。但另一个聪明的方法是使用URL参数,如果你只需要文字值:
function with_options($any) {
parse_str($any); // or extract() for array params
}
with_options("param=123&and=and&or=or");
将此方法与默认参数结合使用,因为它适合您的特定用例。