Задать вопрос
@AndryG

Как провести рефракторинг различающихся сигнатур методов в потомках (php7)?

php7 бросает warning (раньше был "незаметный" strict) сигнатура метода наследника не совпадает с родителем.

PHP Warning: Declaration of ns\Captcha::destroy($memberId) should be compatible with captcha\Obj::destroy()


Код наследника
public function destroy($memberId){
  parent::destroy();
  db::query("update member set ncaptcha = 0 where id = :memberId", $memberId);
}


Ситуация не единичная, таких методов полная кошелка. Посему ломаю голову, как правильней проводить рефракторинг подобного кода. Понимаю, что каждый случай уникальный, но все же. Кто какие варианты рефракторинга подскажет?

В голове вертятся варианты:
1. В потомке новый метод destroyByMember($memberId) , но тогда мы получаем в наследство "неправильный метод" destroy(). Получается его нужно переводить e родителя в protected и в потомках публиковать свои методы destroyBy... c нужной сигнатурой.

2. Прилепить в потомке отдельный сеттер setMember($memberId) и через него указывать memberId для переопреленного destroy()
  • Вопрос задан
  • 247 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 3
@BorisKorobkov Куратор тега PHP
Web developer
Вариант 1 (если сайтом уже пользуются).
Писать все warning в лог. Регулярно читать и исправлять.

Вариант 2 (если есть автотесты).
Выводить все warning на экран и исправлять.

Вариант 3.
Воспользоваться статическим анализатором кода. Например, https://plugins.jetbrains.com/plugin/7622-php-insp...
Ответ написан
neuotq
@neuotq
Прокрастинация
Вы конечно мастер объяснений, к тому же сложно телепатически объять всю структуру приложения и понять что где происходит, что там у родителя, где и как используются/вызываются методы и тп.

Но забавнее всего видеть слово рефакторинг и отсутвие желания исправить ужас:
db::query("update member set ncaptcha = 0 where id = :memberId", $memberId);
, эх..
public function destroy(int $memberId){
//Что тут и зачем хз,  что там происходит ты не написал
parent::destroy();
try{
//Что такое db? PDO?
//Далее почти тупо копипаст из маст рид книги для новичоков Php right way
$stmt = db::prepare('update member set ncaptcha = 0 where id = :memberId');
$stmt->bindParam(':memberId', $memberId, PDO::PARAM_INT); 

if(!$stmt->execute()){
throw new Exception($stmt->errorInfo()[2]);
}

}
 catch (Exceprion $e ) {
throw $e;
}
//А и мы что-нибудь возвращаем? Если да, то выше нужно указать и тип возвращаемого значения у метода
}

ну и try нужно повесить на вызов метода:
//Где-то в далеких недрах кодинга
try {
$tvoyPeremenayaClass->destroy($memberId);
}
catch (Exception $e)
{
echo 'Прости Юра, мы все просрали ...' . $e->getMessage();
}

И это только примерно я написал и это только начало. Вообще нужно начинать с того что поставить php7.1
Ответ написан
@maxtm
Make money, not job
Посему ломаю голову, как правильней проводить рефракторинг подобного кода.

Просто проводить рефакторинг, чтобы таких нюансов не было. Приводите всех предков к единой сигнатуре.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы