Skip to content

Conversation

AlexeyDsov
Copy link
Member

Давно в onPHP есть определенные проблемы с автолоадером на которые наталкиваешься при подключении автолоадеров других проектов и при проверке существования классов.

  1. При использовании class_exists если класс не существует, то кидается ClassNotFoundException, хотя метод должен работать корректно и возвращать false
  2. Невозможно в spl подключить другой автолоадер позже автолоадера из onPHP, т.к. он если не находит класс бросает ClassNotFoundException.

В предлагаемом варианте:

  1. Вынесено бросание ClassNotFoundException в отдельную функцию для spl_autoload_register. Который в свою очередь бросает ClassNotFoundException в случае если вызов не был сделан через функции class_exists, interface_exists, trait_exists. Эта функция должна перезаписываться в конец стека автолоадеров, через вызов Autoloader::registerClassNotFoundLoader();
  2. Основные функции для автолоадера теперь не вызывают функцию __autoload_failed и соответственно не бросают ClassNotFoundException.

Что при этом сломается:

  1. Если кто-то оборачивал class_exists, inteface_exists, trait_exists try/catch/ClassNotFoundException - теперь такой ошибки бросаться не будет.
  2. Если кто-то использовать Assert::classExists, то сейчас он бросает WrongArgumentException вместо ClassNotFoundException. Тут можно оставить что б бросался ClassNotFoundException. Не могу сказать как оно должно быть правильней.

@AlexeyDsov
Copy link
Member Author

С этим фиксом приторможу пока, т.к. хочу вот такие вот фичи доделать:

  1. Сделать автолоадеры не статическими
  2. Разбить на разные классы
  3. Не использовать include_path, а сетить отдельно в каждый экземпляр автолоадер его личный набор путей
  4. Возможно, добавить возможность резолвить неймспейсы двумя способами - по PSR0 и с указанием какая конкретно папка (группа папок) какому неймспейсу соответствует.

@AlexeyDsov
Copy link
Member Author

Закрыто, т.к. добавил улучшенный вариант в #124

@AlexeyDsov AlexeyDsov closed this Aug 7, 2012
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant