Привет всем! Есть класс A, в нем метод add($x, $y). При попытке перегрузить add($x, $y, $z) с доп. параметром из наследника A --> B выдается compatible declare error. В чем смысл этого чуда? Как в php нужно перегружать методы в таком случае?
Временно обошел проблему через func_get_arg, но это костылизм какой-то. Гуру php, нужна ваша помощь...
1. MrAsker - 21 Июня, 2016 - 11:58:05 - перейти к сообщению
2. caballero - 21 Июня, 2016 - 12:08:00 - перейти к сообщению
в PHP нет полиморфизма как в других языках.
add($x, $y, $z=null)
и проверяйте на null последний параметр
Цитата:
Временно обошел проблему через func_get_arg, но это костылизм какой-то.
add($x, $y, $z=null)
и проверяйте на null последний параметр
3. Мелкий - 21 Июня, 2016 - 12:12:53 - перейти к сообщению
Базовый класс задаёт контракт. Наследники могут по-разному реализовывать контракт, но обязаны в точности этому контракту следовать.
Это не специфика PHP - это идея ООП.
Вы не можете сказать, что реализуете контракт метода add с двумя обязательными аргументами, но требовать в потомке передачу трёх обязательных аргументов. Как не можете public метод сделать protected. Контракты несовместимы.
Но внимание на "обязательный аргумент". Если дополнительные аргументы необязательны - этот контракт совместим. protected метод базового класса можно расширить в public дочернего - такой контракт тоже совместим.
Это не специфика PHP - это идея ООП.
Вы не можете сказать, что реализуете контракт метода add с двумя обязательными аргументами, но требовать в потомке передачу трёх обязательных аргументов. Как не можете public метод сделать protected. Контракты несовместимы.
Но внимание на "обязательный аргумент". Если дополнительные аргументы необязательны - этот контракт совместим. protected метод базового класса можно расширить в public дочернего - такой контракт тоже совместим.