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

Имя объекта как свойство класса

Добавлено: Пт янв 16, 2015 2:08 pm
Kod.Begemot
Добрый день!
Возможно вопрос уже поднимался, или это аксиома для опытных программистов, но я не нашел, а опыта нет чтобы разобраться самому.

Можно ли как-то при вызове метода объекта имя этого объекта брать из свойств текущего объекта?

Re: Имя объекта как свойство класса

Добавлено: Пт янв 16, 2015 2:19 pm
zelevova
Имеется ввиду $this->object_title ?
Или я не правильно понял?

Re: Имя объекта как свойство класса

Добавлено: Пт янв 16, 2015 2:29 pm
Kod.Begemot
Нет, интересует другое, вот приведу для примера:
Есть у меня классы:
- "Bridge", в котором объекты - устройства "1wire to ethernet" авторства ТНК с ab-log.ru (свойства - IP, пароль, методы для изменение уставки термостата в устройстве, получения температуры 1wire датчиков, включения/выключения выходов, контроля входов.
- "Thermostat", объекты которого будут хранить параметры термостатов, хранить текущие значения температур, контролировать разбег между уставкой и текущей температурой (чтобы генерировать предупреждения) - и соответственно в методах этого класса будем работать с объектами класса "Bridge".
- "WeekThermostat" - в нём будут храниться объекты - недельные термостаты, временные интервалы, значения в этих интервалах, статусы (включен-выключен тот или иной НедельныйТермостат), соответственно эти методы будут работать с объектами из класса "Thermostat".

Вот сейчас я делаю так, для изменения уставки аппаратного термостата "Bridge1" в методе объекта "Thermostat1" пишу:
callMethod('Bridge1.SetThermostat',array('port'=>1,'value'=>"21.5"));

А хотелось бы, чтобы я указал в свойстве "BridgeName" объекта "Thermostat1" значение "Bridge1", а метод записал бы в методы класса, вроде этого:
callMethod('%BridgeName%.SetThermostat',array('port'=>1,'value'=>"21.5"));
И не пришлось бы редактировать метод каждого объекта, а просто указывать в свойствах имя нужного объекта.

Re: Имя объекта как свойство класса

Добавлено: Пт янв 16, 2015 2:36 pm
zelevova
Так можно для класса "Thermostat" ввести свойство "LinkedBridge". Соответственно в каждом объекте указать соответствующий бридж.
А дальше в методе класса пишем:

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

$LinkedBridge= $this->getProperty('LinkedBridge');
if($LinkedBridge) {
callMethod($LinkedBridge.'.SetThermostat',array('port'=>1,'value'=>"21.5"));
};
Мы не сам объект, а его имя храним в свойстве. Мне этого хватает что бы объекты класса MegaDRelays с классом MegaD связывать указывая какую именно мегу и порт использовать.

Единственное НО: нет проверки на опечатку в имени.

Re: Имя объекта как свойство класса

Добавлено: Пт янв 16, 2015 3:39 pm
Kod.Begemot
Вот!
Это то, что нужно, спасибо!
Да, я и с MegaD тоже собрался это применять - именно для связи с Relays.
Просто в пример привел то, чем занимался в данный момент - упорядочиванием и "станартизацией" термостатов.
zelevova писал(а):Так можно для класса "Thermostat" ввести свойство "LinkedBridge". Соответственно в каждом объекте указать соответствующий бридж.
Вот это я уже сделал, нехватало как-раз того, что вы дальше описали :)

И ещё вопрос - для чего в вашем примере проверка условия?
разве нельзя сделать так:

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

$LinkedBridge= $this->getProperty('LinkedBridge');
callMethod($LinkedBridge.'.SetThermostat',array('port'=>1,'value'=>"21.5"));
P.S. я только учусь в этом языке, раньше только с Си дело имел. потому логику этого языка постигаю с трудом :)

Re: Имя объекта как свойство класса

Добавлено: Пт янв 16, 2015 3:55 pm
zelevova
Условие для проверки указан ли слинкованный бридж. Если имя не заданно то и метод не вызовется. Можно как ты указал. Можно вообще получение реквизиты в вызов самого метода запихнуть. будет не совсем читаемо, зато в одну строку. :)
Это видимо привычка перепроверять заполненность реквизитов. :)
PS может port тоже в свойстве хранить?

Re: Имя объекта как свойство класса

Добавлено: Пт янв 16, 2015 4:19 pm
Kod.Begemot
Да, конечно - порт тоже будет свойством.
Сейчас как-раз создаю объекты. пишу методы, получается на мой взгляд логично и как-то универсально, что-ли.

Вопрос - а если свойство не указано - то что произойдет в данном случае?
и ещё вопрос - вот вы писали что " нет проверки на опечатку в имени", а может можно как-то в условии проверять наличие такого объекта, какое имя указано?

Re: Имя объекта как свойство класса

Добавлено: Пт янв 30, 2015 4:31 pm
Bagir
Можно в цикле перебирать все объекты в поисках своего. Но для данной задачи это не целесообразно, сильно раздует код и увеличит процессорное время. Вообщем не советую. а вот условие if($LinkedBridge) {...} будет очень даже кстати. Даже если мы планируем, что эти свойства должны быть обязательны, все равно может быть ситуация, когда свойство не будет задано, и условие поможет корректно ее обойти.
У меня сейчас так все данные с объектов датчиков передаются объектам комнат.