Меня не удивляет, что строгий режим PHP жалуется на такое переопределение. Подобную ситуацию очень легко непреднамеренно создать, в которой часть иерархии классов была отредактирована для использования новой подписи, и один или несколько классов вышли из синхронизации.
Чтобы избежать неоднозначности, назовите новый метод как-нибудь по-другому (для этого примера, возможно, readAt
?) И переопределите read
, чтобы вызвать readAt
в новом классе. Это делает намерение понятным как для переводчика, так и для любого, кто читает код.
Фактическое поведение в таком случае зависит от языка - более конкретно, оно зависит от того, какая часть сигнатуры составляет селектор метода и как передаются параметры.
Если только имя является селектором (как в PHP или Perl), то все зависит от того, как язык обрабатывает несоответствующие списки параметров метода. Если аргументы по умолчанию обрабатываются на сайте вызова на основе статического типа получателя, а не на точке входа вызываемого, при вызове через ссылку на базовый класс вы получите неопределенное значение аргумента вместо указанного по умолчанию, аналогично что произойдет, если не будет указано значение по умолчанию.
Если количество параметров (с их типами или без них) является частью селектора метода (как в Erlang или E), как это обычно бывает в динамических языках, работающих на JVM или CLR, у вас есть два разных метода. Создайте новую перегрузку, принимая дополнительные аргументы, и переопределите базовый метод тем, который вызывает новую перегрузку со значениями аргументов по умолчанию.