наследование — почему php не устраивает несовместимость подписи открытого метода с подписью родительского частного метода?

Следующий кусок кода

<?php

class A {
private function test($str = null) {
echo $str;
}
}

class B extends A {
public function test() {
echo 'b';
}
}

$b = new B();
$b->test();

дает

Предупреждение: объявление B :: test () должно быть совместимо с A :: test ($ str = NULL) в / in / oCG5c в строке 13

доказательство Вот.

Почему это ? Обратите внимание, что родительский метод является приватным, обратите внимание, что это не проблема для hhvm, и обратите внимание, как php 7 переводит это в предупреждение.

ОБНОВЛЕНИЕ: чтобы сделать вещи немного яснее, следующий фрагмент кода, как и ожидалось, не дает предупреждения :

<?php

class A {
private function test($str = null) {
echo $str;
}
}

class B extends A {
private function test() {
echo 'b';
}
}

$b = new B();

Если это поможет, вот небольшое напоминание о том, что личное означает для свойств:

<?php

class A
{
private $a;
}

class B extends A
{
private $a;
}

$b = new B();
var_dump($b);

object (B) # 1 (2) {[«a»: «B»: private] => NULL [«a»: «A»: private] => NULL}

Иметь два частных свойства с одинаковым именем — это нормально. Так должно быть и для методов.

2

Решение

Задача ещё не решена.

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

Других решений пока нет …

По вопросам рекламы [email protected]