Следующий кусок кода
<?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}
Иметь два частных свойства с одинаковым именем — это нормально. Так должно быть и для методов.
Задача ещё не решена.
Других решений пока нет …