Я зарегистрировал автозагрузчик (spl_autoload_register) и установил собственный обработчик ошибок (set_error_handler).
Далее у меня есть 3 класса: Class1, Class2 и Class3. Class2 расширяет Class1, но их методы getText () не совпадают. (Class1 ожидает параметр типа Class3)
Включение первого класса Class1 и второго Class2 дает мне фатальную ошибку «Class ‘Class3’ не найден в …». То, что я ожидал бы, — строгое предупреждение.
(Если я сначала не включу Class1, все будет хорошо.)
index.php
<?php
class AutoLoader
{
public static function run ($className)
{
require(__DIR__."/".$className.".php");
}
}
spl_autoload_register(array('AutoLoader', "run"));
class ErrorHandler
{
public static function error ($errno, $errstr, $errfile, $errline)
{
echo 'error';
}
}
set_error_handler('ErrorHandler::error');
echo 'a';
require( __DIR__.'\Class1.php' );
echo 'b';
require( __DIR__.'\Class2.php' );
echo 'c';
?>
Class1.php
<?php
class Class1
{
public static function getText ($text=Class3::TEXT)
{
}
}
?>
class2.php
<?php
class Class2 extends Class1
{
public static function getText ()
{
}
}
?>
Class3.php
<?php
class Class3
{
const TEXT = "text";
}
?>
С php 5.3.5 я получаю ожидаемый результат: aberrorc
С php 5.5.6 я получаю фатальную ошибку: abFatal error …
Подобная проблема описана здесь Функция set_error_handler не вызывает автозагрузку и здесь https://bugs.php.net/bug.php?id=54054
(Оба пытаются автоматически загрузить класс в функции обработчика ошибок. Ответы о «компиляции / выполнении», говоря, что это «не ошибка». Я сомневаюсь в этом, потому что он работает в 5.3, и это не так точно такая же настройка.)
Как я могу исправить эту проблему, не разбирая все строгие предупреждения в моих сценариях?
Задача ещё не решена.
Других решений пока нет …