Страница 1 из 1

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

Добавлено: Пт июн 06, 2014 3:54 pm
roman
Есть метод класса, есть метод объекта этого класса.
У объекта указано, что выполнять метод класса до выполнения метода объекта.
Если ли какая-то возможность на уровне метода класса отменить выполнение метода объекта?

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

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

Но все такие хотелось бы узнать ответ на изначальный вопрос.

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

Добавлено: Пт июн 06, 2014 4:37 pm
Ivan
Вам поможет ООП

Создайте класс наследника. В нём пропишите в нём свою обработку
Перепривязать объекты к новому классу

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

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

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

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

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

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

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

Добавлено: Вт сен 06, 2022 7:24 pm
Bagir
Я тоже озадачился подобной задачей. $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 - решение принято родительским кодом, выполнение кода объекта блокировано.