Странное поведение метода PHP не существует, но есть в коде

#php #static-methods #php-5.2

#php #статические методы #php-5.2

Вопрос:

Кто-нибудь имеет представление об этом? PHP 5.2.13. Результаты не полностью согласованы, т. Е. может быть получен хороший результат со страницей в один момент, а затем ошибка в другой.

Ошибка является фатальной — у класса нет метода.

Но верно следующее:

Класс определен только в одном месте и имеет соответствующий метод в коде. В точке, где происходит сбой: отражение показывает, что метод существует. В точке, где происходит сбой: method_exists сообщает, что метод не существует. Предыдущие вызовы (все они статические — не мой выбор) ранее в коде работали.

Комментарии:

1. Не могли бы вы показать какой-нибудь код?

2. Исходный код является частью Joomla и выглядит просто: ‘ jimport( ‘joomla.application.router’); $router =amp; JRouter::getInstance($name, $options);’ К этому была добавлена диагностика, чтобы показать, что класс JRouter существует после первой строки, и создать класс отражения, вызвать и сбросить GetMethods(), который показывает, что getInstance является методом JRouter (как и проверка кода).

Ответ №1:

Может быть, это связано: http://bugs.php.net/bug.php?id=51425

Но я думаю, что здесь у нас есть некоторая проблема, связанная с кэшем. У вас включен какой-нибудь кэш? Как APC или любые другие ускорители?

Комментарии:

1. Я также страдал от проблем method_exists в 5.3.x, хотя это не кажется слишком похожим. Моя проблема с method_exists заключается в том, что он прерывается при вызове с именем класса для класса, который не существует (должен просто возвращать false). Любопытно, что кто-то должен знать о проблеме, потому что Debian 5.3.3 и 5.3.6 оба работают корректно. Но эта проблема связана не с ошибкой segfault, а с сообщением о фатальной ошибке PHP. И диагностика противоречива. Очень странно.

Ответ №2:

Убедитесь, что файл, содержащий метод, включен. Если метод находится в классе, убедитесь, что экземпляр класса создан и метод вызывается через класс.

Может быть, вам не хватает экземпляра класса?

Комментарии:

1. Спасибо за ваш комментарий. Класс отображается как существующий путем сброса class_exists() вместе с другими диагностическими данными. Рассматриваемый метод является статическим и, следовательно, не зависит от создаваемого экземпляра класса.

2. Являются ли функции частными в вашем статическом классе?