我想在这样的类中实现一个方法:
class Query {
public function orderBy($dir="asc", ...$fields){}
}
其中$dir
是默认参数,而$field
是使用(...
)令牌的变长参数。
问题在于可变长度参数必须在末尾声明,而当我这样做时,开发人员无法将第一个参数跳过为其默认值。我该如何解决?
请注意,我不想使用func_get_args()
,因为我希望开发人员具有一些类型提示。
答案 0 :(得分:1)
这根本不可行。 PHP不支持此功能,因此也没有太大意义。唯一可行的方法是像在其他语言中一样,通过命名参数来使参数顺序无关紧要。
此外,您对此处使用可变参数的要求是人为的,不是很有用。只需使用数组和可选的order参数即可。
例如:
function orderBy(array $columns, string $order = 'asc') {
// do your thing
}
更整洁,使方法用户更容易理解,并且符合语言语法。
如果您希望它看起来与可变参数函数“相似”,只需使用如下语法调用该方法:
orderBy(["column1", "column5"]);
orderBy(["column2"], 'desc');
答案 1 :(得分:0)
我想做的是:
function tableHead($id=NULL, $class=NULL, ...$columnsHeads)
当我不希望使用前两个参数时,“逻辑”函数调用为:
tableHead( , , "Dogs","Cars","Sausages");
不幸的是,PHP不允许您使用,
作为空默认值。我通过将NULL, NULL,
作为前两个参数来解决这个问题。不理想,但现在可以!
(我确定20年前我曾使用某种语言的空,
发送一个空值-有人知道吗?还是只是一厢情愿?)
我的解决方案(哈哈)是:
tableHead(NULL, NULL, "dogs","cars", "sausages");
不理想,但是可以。在正常使用情况下,将使用由变量指定的id
和class
来调用该函数。就个人而言,我看不到将可变参数和可选参数组合在一起的任何邪恶……但是您必须要小心一点!