[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Автоматический вызов метода, при вызове другого
Страницы: 1, 2
AllesKlar
Не вдаваясь в подробности, просто вопрос:

Можно ли принудительно вызывать определенный метод класса (не указывая явно вызов), вначале / при завершении работы других методов данного класа ?



_____________
[продано копирайтерам]
inpost
AllesKlar
Очень странная задача. Может проще повесить Proxy класс поверх нужного и указать нужные методы для вызова перед или после вызова метода?
Можно было бы попробовать ещё закрыть методы и попробовать __call, но не уверен, так как не тестировал.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
AllesKlar
Пишу класс, который использует сторонний API
API возвращает xml, но периодически этот API отваливается.
И функция simplexml_load_file($xml_url) вываливает мне варнунги.
Да, пока что я вначале каждого своего метода отключаю варнунги, в конце каждого метода востанавливаю их значение.
Но бест, что в каждом методе нужно дублировать один и тот же код.

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

Вот и подумал, а может есть оно, типа
 __before_call(){ /* отключаем варнунги */ };
__after_call(){ /* включаем варнунги */ };


_____________
[продано копирайтерам]
sergeiss
AllesKlar, я думаю, что ничего нет невозможного :)

Надо просто правильно использовать "магию классов", в данном случае __call(): http://php.net/manual/ru/language.oop5.ove...php#object.call

Допустим, ты хочешь вызвать эти свои
 __before_call(){ /* отключаем варнунги */ };
__after_call(){ /* включаем варнунги */ };

в связи с методом load_data()


Нет проблем...
1. Вызываешь метод load_data_2(). Так как такого метода нет, то ты попадаешь в "магический" __call().
2. Там получаешь имя вызванного метода, откидываешь от него ненужный суффикс "_2".
3. Изнутри __call() вызываешь __before_call(){ /* отключаем варнунги */ };
4. Изнутри __call() вызываешь load_data()
5. Изнутри __call() вызываешь __after_call(){ /* включаем варнунги */ };
6. Вуаля, как говорят наши друзья-французы :) Ты получил то, что хотел. И более того, для разных методов могут быть разные before()/after()

Мне кажется, что это даже и не костыль будет, а как раз нормальное использование "магии" в пхп-шном ООП.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
AllesKlar
sergeiss
Малаца smile.gif

_____________
[продано копирайтерам]
Invis1ble
Цитата (AllesKlar @ 20.03.2015 - 00:19)
И функция simplexml_load_file($xml_url) вываливает мне варнунги.

а зачем ты кормишь simple_xml_file кривым контентом?
делай запрос к API и проверяй заголовки ответа, если не text/xml или application/xml, то значит не судьба, а в идеале вообще достаточно код ответа проверять

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

AllesKlar
Invis1ble
Цитата
делай запрос к API и проверяй заголовки ответа

API работает через GET
Городить огород с отправкой запроса, чтением заголовков, etc.


_____________
[продано копирайтерам]
Invis1ble
какой огород, делаешь простейший курл-запрос и смотришь ответ, если всё норм - отдаешь тело ответа парсеру
да, это немного сложнее, чем втупую глушить ошибки, но самый грамотный вариант, имхо

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

AllesKlar
Invis1ble
Я пытаюсь избежать дублирования 2х строк в каждом методе, а ты предлагаешь, вместо одной строки simple_xml_file($api_request) просписывать в каждом методе курл запрос?

А, всё. Приватный метод, который читает xml, а там уже смотрим, выругался simple_xml_file() или нет

_____________
[продано копирайтерам]
Invis1ble
Цитата
Я пытаюсь избежать дублирования 2х строк в каждом методе, а ты предлагаешь, вместо одной строки simple_xml_file($api_request) просписывать в каждом методе курл запрос?

А, всё. Приватный метод, который читает xml, а там уже смотрим, выругался simple_xml_file() или нет

приватный метод с курлом и парсингом
далее смотря как ложится API, если наглухо - то в методе ловить ошибки курла, например таймаут, если API отдает какую-то заглушку - смотреть на наличие xml в content-type

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

AllesKlar
Цитата
чем втупую глушить ошибки, но самый грамотный вариант, имхо

Ну почему же втупую глушить? Если для simple_xml_file существует лишь 2 варианта удача / неудача+выкинул варнунг, почему это не обработать?
Зачем из пушки по воробъям?

_____________
[продано копирайтерам]
Invis1ble
ты можешь конечно делать как хочешь
это моё мнение, что отдавать на обработку заведомо неизвестно какие данные нехорошо
поэтому лучше сначала узнать, что за ответ получен и получен ли вообще, а потом уже обрабатывать корректный ответ
по-моему, из пушки по воробьям - это инициализация парсера вхолостую

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

AllesKlar
Цитата
по-моему, из пушки по воробьям - это инициализация парсера вхолостую

Аргумент.
Завтра спрошу заказчика, что он хочет - эффективности или простоты кода.

_____________
[продано копирайтерам]
Bolik
что может быть проще и эффективнее одного единственного метода загрузки контента через курл и проверки заголовков? все остальное и есть дублирование кода, которое ты хочешь избежать.
inpost
AllesKlar
А simplexml_load_file исключения не кидает?
Если нет, то печально, обещают к концу года этого ввести

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.