Иногда, особенно в случае функций обратного вызова или в случае наследования / реализации, я не хочу использовать некоторые аргументы в методе. Но они необходимы для сигнатуры интерфейса метода (и я не могу изменить сигнатуру, скажем, это требуется через 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? Я что-то пропустил?
Примечание: это не только для конечных аргументов, это может быть где угодно в объявлении функции
Я думаю, что лучшее, на что вы можете надеяться, это дать им уникальные имена, которые будут предполагать, что они не будут использоваться в вызове.
Может быть:
function doSomething($usefull,$x1,$x2){
return something_with($usefull);
}
Или же:
function doSomething($ignore1,$useful,$ignore2){
return something_with($useful);
}
PHP хочет, чтобы аргументы учитывались и имели уникальные имена.
Изменить: Если вы хотите избежать объявления переменных, которые вы не будете использовать (но вы знаете, что они отправляются), попробуйте func_get_args () а также список(). Это должно сделать код легким, чистым, читабельным. (демонстрация)
function test(){
// get only use argument 2
list(,$useful,)=func_get_args();
echo $useful;
}
test('one','two','three'); // outputs: two
Назначьте значение по умолчанию для необязательного параметра.
function doSomething($usefull,$useless1=null,$useless2=null){
return something_with($usefull);
}
Сейчас….
Параметр 1 обязателен
Параметр 2 является необязательным
Параметр 3 является необязательным
Вызов функции как ..
doSomething($data);
doSomething($data,$anotherData);
doSomething($data,$anotherData,$anotherData1);
Ваш конкретный объект не полностью соответствует интерфейсу, поэтому вы можете просто добавить класс адаптера между ними. Таким образом, интерфейс остается без изменений, а ваш объект просто получает то, что ему действительно нужно.
class Adapter extends CustomInterface
{
function doSomething($ignore1,$useful,$ignore2){
return $customClass->something_with($useful);
}
}