Есть ли способ явно игнорировать агрументы, объявленные в сигнатуре функции

Иногда, особенно в случае функций обратного вызова или в случае наследования / реализации, я не хочу использовать некоторые аргументы в методе. Но они необходимы для сигнатуры интерфейса метода (и я не могу изменить сигнатуру, скажем, это требуется через 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

Решение

Я думаю, что лучшее, на что вы можете надеяться, это дать им уникальные имена, которые будут предполагать, что они не будут использоваться в вызове.

Может быть:

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
1

Другие решения

Назначьте значение по умолчанию для необязательного параметра.

function doSomething($usefull,$useless1=null,$useless2=null){
return something_with($usefull);
}

Сейчас….
Параметр 1 обязателен
Параметр 2 является необязательным
Параметр 3 является необязательным

Вызов функции как ..

doSomething($data);
doSomething($data,$anotherData);
doSomething($data,$anotherData,$anotherData1);
1

Ваш конкретный объект не полностью соответствует интерфейсу, поэтому вы можете просто добавить класс адаптера между ними. Таким образом, интерфейс остается без изменений, а ваш объект просто получает то, что ему действительно нужно.

class Adapter extends CustomInterface
{
function doSomething($ignore1,$useful,$ignore2){
return $customClass->something_with($useful);
}
}
1
По вопросам рекламы [email protected]