нужен - интерфейс php




Прерывистая ошибка абстрактного класса в PHP (3)

Если вы разрабатываете на Windows, я бы порекомендовал вам НЕ использовать XAMPP или WAMPP и попробовать настоящий сервер разработки, использующий Linux на виртуальной машине.

Попробуйте установить Vagrant и Virtualbox, а затем перейдите на puphpet.com, который может создать конфигурацию виртуальной машины. Разархивируйте загрузку, перейдите в папку и введите vagrant up. Затем просто укажите ваш хост на ВМ. Бьюсь об заклад, как только у вас появится реальная среда разработки, эта ошибка исчезнет. Другой вариант - Docker, но у него есть немного кривой обучения.

Проблема не в вашем коде (или коде вашего поставщика), а в вашей платформе.

Я боролся с этим немного, и не могу понять это, возможно, у кого-то есть или, может быть, есть более глубокая проблема с Slim, PHP, Apache и т. Д. После многочасовой работы моя установка Slim начнет давать это на всех маршрутах:

Неустранимая ошибка: класс Slim \ Collection содержит 1 абстрактный метод и поэтому должен быть объявлен как абстрактный или реализовывать оставшиеся методы (IteratorAggregate :: getIterator) в F: \ Projects \ example \ server \ vendor \ slim \ slim \ Slim \ Collection.php на строка 21

К сожалению, эта проблема исчезнет, ​​если я перезапущу Apache. (В любом случае, на несколько часов.)

Я обнаружил это там, где у кого-то была похожая проблема два года назад, и человек, помогающий ему, поставил их в известность, не оказав им никакой помощи: https://community.apachefriends.org/viewtopic.php?p=250966&sid=96ef58aaeb7fe142a7dcdfd506a8683f

Я попытался сделать чистую очистку и установить мой каталог поставщика композитора. Это не исправит это. Я ясно вижу, что getIterator реализован, как ожидается, в файле в сообщении об ошибке.

Версия PHP 7.0.12, Windows 7, x86 PHP Build

Это произошло снова через несколько часов с другим, но похожим сообщением об ошибке:

Неустранимая ошибка: класс Pimple \ Container содержит 1 абстрактный метод и поэтому должен быть объявлен абстрактным или реализовать оставшиеся методы (ArrayAccess :: sqlserver) в F: \ Projects \ example \ server \ vendor \ pimple \ pimple \ src \ Pimple \ Container. PHP на линии 34

Этот вопрос имеет аналогичную проблему и «решает» ее, перезапуская PHP, но это явно не является реальным решением, и у меня не включен opcache: PHP 7, Symfony 3: Фатальная ошибка 1 абстрактный метод и поэтому должен быть объявлен абстрагировать или реализовать оставшиеся методы

Есть догадки? Помните: это сообщение находится в файлах, которые я не писал, и исчезает при перезапуске Apache. Есть ли какое-то кеширование в PHP 7, которое могло бы вызвать это?

Изменить 3/10/17:

Да, я открыл билет со Слимом. Я также видел это в не тонком файле (Pimple), поэтому я не думаю, что это проблема Slim. https://github.com/slimphp/Slim/issues/2160

Как я уже сказал, мой opcache отключен. Я подтвердил, что это верно как в файле php.ini, так и в phpinfo ().


У меня была та же проблема с использованием CodeIgniter и PHP 7.1.x.

Я обновился до PHP 7.2, и проблема больше не возникала.


Я сталкивался с этим точным поведением, и это не была ошибка opcache, даже если она была вызвана opcache.

Проблема заключалась в том, что у нас было несколько классов с одинаковым базовым именем, например

Request\GenericProtocol\Dispatcher     abstract
Request\Protocol1\Dispatcher
Request\Protocol2\Dispatcher

Теперь по умолчанию в нашей установке opcache использовал «оптимизацию», в которой базовое имя использовалось только как ключ кеша. В результате, всякий раз, когда сценарий создавал экземпляр диспетчера Protocol2 в чистом кэше, он тонко саботировал все последующие вызовы с помощью Protocol1. Из-за шаблонов использования это маскируется под любой другой вид ошибки.

В итоге мы просто активировали соответствующую опцию:

opcache.use_cwd логический

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

Условие нарушения таково: у вас есть как минимум два класса с одинаковым базовым именем .

Наша следующая итерация действительно должна переименовать много классов

 Request\Protocol1\Dispatcher   ==> Request\Protocol1\Protocol1Dispatcher

чтобы можно было снова отключить use_cwd и сжать несколько процентов производительности (PTB и PHB считают, что это того стоит), но я знаю, что это может быть невозможно с любой имеющейся инфраструктурой.







slim