PHP Клас-обгортка для методів

PHP: Клас-обгортка для методів

Отже, найбільш просте рішення - це створити метод (wrapper) який як параметри буде приймати назву і параметр методу, що викликається. В даному випадку метод wrapper і є тією самою обгорткою. Реалізація цього рішення може бути наступною:

Exceptions.php

ModelExtension.php

MyModel.php

Давайте розберемо, що я тут понаписав.

У прикладі беруть участь кілька файлів:

  • Exceptions.php- у ньому створені винятки, для перехоплення помилок у запитах ExceptionDb і моделі ExceptionModel .
  • ModelExtension.php- батьківський клас моделі. Від нього успадковуються всі моделі, що використовуються в проекті. У ньому описаний метод wrapper . Як перший аргумент він приймає назву викликаного методу, другим аргументом йдуть дані, що передаються в метод, що викликається. Перед викликом методу, через функцію is_callable перевіряється що існує і може бути викликаний, інакше генерується виняток ExceptionModel , яке відразу і перехоплюється, т.к. конструкція if-else поміщена в блок try-catch. Якщо метод існує, він викликається поміщений у блок try - catch , який перехоплює винятки ExceptionDb запитів у БД. Саме цей момент треба було реалізувати.
  • MyModel.php- тестова модель. Клас MyModel розширює ModelExtension. У ньому описані тестові методи, які виконуються успішно (метод query) або завершуються виключенням ExceptionDb (метод errorQuery).
  • index.php- збирає всі файли та запускає тестовий приклад.

Результатом роботи цього прикладу будуть повідомлення:

Метод «query» loaded Error in method «errorQuery» Method"anotherQuery" not found

Все працює, як і очікувалося. Однак очевидно, що конструкція $model-не зовсім вдале рішення. Куди зручніше і звичніше використовувати $model-. Зробити це нам допоможе один із «магічних» методів PHP, а саме метод __call. Нагадаю, що він викликається щоразу, коли запитується неіснуючий метод класу. Можна створити псевдо-клас моделі, в якому буде описано лише метод __call() , який перенаправлятиме виклик методів на реальний клас моделі. Щоб втілити задумане, потрібно модифікувати код:

ModelLoader.php

MyModel.php

У цьому прикладі ми позбулися класу ModelExtension і додали новий — ModelLoader.

Під час створення об'єкта ModelLoader передається назва класу моделі. Метод __call у класі ModelLoader повністю повторює метод wrapper, з невеликим доповненням, при першому виклику створюється екземпляр моделі. Перед створенням перевіряється, чи існує клас, що викликається. Щоб здійснити цю перевірку, ми доповнили клас MyModel функцією __construct .

Ось у принципі і все. Якщо запустити index.php, то результат буде ідентичний результату першого прикладу.

Скомпонований готовий скрипт можназавантажити тут.

Схожі теми

Підписатися на оновлення блогу

Вам сподобався наш блог, хочете стежити за оновленнями?Підпишіться на RSS розсилку або розсилку електронною поштою. Також ви можете стежити за нами в Twitter.