有时候,特别是对于回调函数或继承/实现的情况,我不想在方法中使用一些参数。但它们是方法接口签名所要求的(我无法更改签名,假设它是通过Composer所需的)。例如:
// Assuming the class implements an interface with this method:
// public function doSomething($usefull1, $usefull2, $usefull3);
public function doSomething($usefull, $useless_here, $useless_here) {
return something_with($usefull);
}
// ...
在其他一些语言中(比方说Rust),我可以明确地忽略这些参数,这使得代码(和意图)更具可读性。在PHP中,它可能是这样的:
public function doSomething($usefull, $_, $_) {
return something_with($usefull);
}
这在PHP中可行吗?我错过了什么吗?
旁注:它不仅适用于尾随参数,它可以在函数声明中的任何位置
答案 0 :(得分:1)
我认为你能想到的最好的就是给他们一个独特的名字,这些名字会暗示他们不会在电话中使用。
也许:
function doSomething($usefull,$x1,$x2){
return something_with($usefull);
}
或者:
function doSomething($ignore1,$useful,$ignore2){
return something_with($useful);
}
PHP希望将参数考虑在内并进行唯一命名。
编辑:如果您想避免声明您不会使用的变量(但您知道它们正在发送),请尝试func_get_args()和list()。这应该使代码精简,干净,可读。 (Demo)
function test(){
// get only use argument 2
list(,$useful,)=func_get_args();
echo $useful;
}
test('one','two','three'); // outputs: two
答案 1 :(得分:1)
为可选参数指定默认值。
function doSomething($usefull,$useless1=null,$useless2=null){
return something_with($usefull);
}
现在.... 参数1是必需的 参数2是可选的 参数3是可选的
调用函数,如..
doSomething($data);
doSomething($data,$anotherData);
doSomething($data,$anotherData,$anotherData1);
答案 2 :(得分:1)
您的具体对象完全不适合接口,因此您只需在它们之间添加适配器类。所以界面保持原样,你的对象就能得到它真正需要的东西。
class Adapter extends CustomInterface
{
function doSomething($ignore1,$useful,$ignore2){
return $customClass->something_with($useful);
}
}