Как отменить выполнение метода объекта в метода класса?

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Ответить
roman
Сообщения: 10
Зарегистрирован: Вс апр 13, 2014 5:33 pm
Благодарил (а): 0
Поблагодарили: 0

Как отменить выполнение метода объекта в метода класса?

Сообщение roman » Пт июн 06, 2014 3:54 pm

Есть метод класса, есть метод объекта этого класса.
У объекта указано, что выполнять метод класса до выполнения метода объекта.
Если ли какая-то возможность на уровне метода класса отменить выполнение метода объекта?

Реальное применение:
Есть много выключателей (класс wallSwitch) у них есть метод объекта statusChanged в котором я прописываю действие включить/выключить. А теперь допустим я хочу чтобы они работали только с 8 до 22 - мне либо прописать проверку в методе каждого объекта или написать один раз в методе класса.

Пока писал вопрос придумал обходной путь:
- сделать разные название для методов класса и объекта
- вызывать метод класса и уже их него при прохождении проверок вызывать метод объекта.

Но все такие хотелось бы узнать ответ на изначальный вопрос.
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

Re: Как отменить выполнение метода объекта в метода класса?

Сообщение Ivan » Пт июн 06, 2014 4:37 pm

Вам поможет ООП

Создайте класс наследника. В нём пропишите в нём свою обработку
Перепривязать объекты к новому классу
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Как отменить выполнение метода объекта в метода класса?

Сообщение sergejey » Пт июн 06, 2014 4:39 pm

Просто так из кода метода класса нельзя отменить выполнение кода объекта. Ещё из простых вариантов пришедших в голову, это завести какое-то свойство, которое метод класса будет устанавливать в 1 или 0, а метод объекта в самом начале проверять.
в коде метода класса пишем:

Код: Выделить всё

$this->setProperty('AllowExecution',1); //разрешить
$this->setProperty('AllowExecution',0); //запретить
в коде метода объекта пишем

Код: Выделить всё

if (!$this->getProperty('AllowExecution')) {
 return;
} 

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 374 раза

Re: Как отменить выполнение метода объекта в метода класса?

Сообщение Bagir » Вт сен 06, 2022 7:24 pm

Я тоже озадачился подобной задачей. $this->setProperty первое что пришло в голову, но так делать мне не хотелось. Тема была заброшена, но сейчас для меня снова стала актуальной.
В родительском методе пишем

Код: Выделить всё

global $do_not_execute_object_method;
и при каком то там условии

Код: Выделить всё

$do_not_execute_object_method = true;
В начале кода объекта

Код: Выделить всё

global $do_not_execute_object_method;
if ($do_not_execute_object_method) { return; } 
Стоит понимать, что код метода объекта всё равно будет выполнен, но при этом он сразу будет завершен.

И раз уж разговор идет о связке родительского кода и кода метода объекта, то вот ещё интересная штучка:
Допустим мы управляем реле, и в родительском коде принимаем решение, что реле точно будет включено или выключено. Лично у меня на это может повлиять свойство со значениями выкл/вкл/авто, а так же существования таймера для работы или блокировки. Родительский код переключает реле и завершается с помощью return 3; Если решение не было принято родительским кодом, то в конце завершим его return 2; Теперь самое интересное, если у объекта есть свой настроенный код метода, то по завершению, если мы ничего не укажем в return, ответ будет 1. Теперь мы можем видеть, есть ли у объекта заполненный метод, или решение было принято родительским.
Пример использования:
При активности в комнате я хочу включить свет. У моих реле есть метод logic в котором я храню логику работы реле со всякими условиями. Но этот метод заполнен далеко не для всех моих реле.

Код: Выделить всё

 // Включить свет
 if ((int)cm('RelayBhZalLight1.logic') == 2) {
  if (!gg('RelayBhZalLight1.status')) {
   callMethod('RelayBhZalLight1.turnOn');
  }
 }
Я понятия не имею, когда руки дойдут до написания логики конкретно этого реле, и нужно ли вообще это будет, но как только это случиться, RelayBhZalLight1.logic перестанет возвращать 2, и будут работать уже условия в этом объекте.
А если посмотреть ещё шире, то ответ RelayBhZalLight1.logic может быть
1 - решение о работе реле принял код метода объекта
2 - своего кода у объекта нет, родительский код не принял решение о изменении статуса реле
3 - решение принято родительским кодом, выполнение кода объекта блокировано.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Ответить