/ / Ловіть помилку миттєвого виявлення об'єкта PHP - php, php-5.2

Спіймати помилку об'єкту PHP - php, php-5.2

Мене насправді дратує те, що PHP вважає неспроможність інстанціювати об'єкт a Фатальна помилка (яка не може бути спіймана) для програми якціле. У мене є безліч класів, які не потрібні для мого застосування - вони справді зручні. У мене є заводський об'єкт, який намагається створити варіант класу, який "вказаний у файлі config.

Цей механізм розгортається для зберігання повідомлень і підтримуватиме кілька типів магазину:

  • DatabaseMessageStore
  • FileMessageStore
  • MemcachedMessageStore
  • тощо.

А. MessageStoreFactory клас прочитає перевагу програми з конфігураційного файлу, інстанціює та поверне екземпляр відповідного класу.

Це може бути досить просто перемогти умовне коло моменту, щоб забезпечити це class_exists(), але MemcachedMessageStore розширює PHP "s Memcached клас. В результаті цього class_exists() тест буде успішним - хоча екземпляр не вдасться - якщо не встановлені згадані прив'язки для PHP.

Чи є інший спосіб перевірити, чи є класможна правильно встановити? Якщо вона не може ", все, що мені потрібно зробити, - це сказати користувачеві, які функції не будуть їм доступні, але дозвольте їм продовжувати роботу з додатком.

Відповіді:

0 для відповіді № 1

Якщо ви використовуєте автоматичне завантаження для завантаження файлів класу(що вам слід), ви можете кинути спеціальне виключення право наприкінці функцій автозавантажувачів, якщо запитуваний клас ще не доступний для інстанцій. Це має викликати будь-який час, коли не існує існуючого класу, навіть для внутрішніх класів PHP. Отже, це має спрацювати у вашому випадку.


0 для відповіді № 2

Якщо ваша проблема полягає в тому, щоб зловити свою фатальну помилку, вам слід спробувати написати власний обробник помилок і діяти відповідно до повідомлення про помилку. Таким чином ви зможете вирішити проблему спадщини за допомогою Memcache.


0 для відповіді № 3

Наскільки я можу сказати, цього не можна зробити за рамками PHP 5.3. Натомість я зробив те, щоб змусити перевірити заводський клас на наявність Memcached перед тим, як ініціювати клас, який його розширює. Він незграбний і надто крихкий на мій смак, але зараз він працює. Коли ми оновимо до 5.3, я його трохи перероблю.