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

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

Модератор: immortal

Ответить
Аватара пользователя
Kod.Begemot
Сообщения: 358
Зарегистрирован: Чт июн 20, 2013 5:53 pm
Благодарил (а): 32 раза
Поблагодарили: 42 раза

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

Сообщение Kod.Begemot » Пт янв 16, 2015 2:08 pm

Добрый день!
Возможно вопрос уже поднимался, или это аксиома для опытных программистов, но я не нашел, а опыта нет чтобы разобраться самому.

Можно ли как-то при вызове метода объекта имя этого объекта брать из свойств текущего объекта?
zelevova
Сообщения: 291
Зарегистрирован: Вт ноя 18, 2014 11:43 pm
Откуда: Краснодарский край
Благодарил (а): 32 раза
Поблагодарили: 68 раз

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

Сообщение zelevova » Пт янв 16, 2015 2:19 pm

Имеется ввиду $this->object_title ?
Или я не правильно понял?
Majordomo (GitHub) на cubietruck + MegaD + 1-wire
CONNECT: http://connect.smartliving.ru/profile/311
Аватара пользователя
Kod.Begemot
Сообщения: 358
Зарегистрирован: Чт июн 20, 2013 5:53 pm
Благодарил (а): 32 раза
Поблагодарили: 42 раза

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

Сообщение Kod.Begemot » Пт янв 16, 2015 2:29 pm

Нет, интересует другое, вот приведу для примера:
Есть у меня классы:
- "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"));
И не пришлось бы редактировать метод каждого объекта, а просто указывать в свойствах имя нужного объекта.
zelevova
Сообщения: 291
Зарегистрирован: Вт ноя 18, 2014 11:43 pm
Откуда: Краснодарский край
Благодарил (а): 32 раза
Поблагодарили: 68 раз

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

Сообщение zelevova » Пт янв 16, 2015 2:36 pm

Так можно для класса "Thermostat" ввести свойство "LinkedBridge". Соответственно в каждом объекте указать соответствующий бридж.
А дальше в методе класса пишем:

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

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

Единственное НО: нет проверки на опечатку в имени.
Majordomo (GitHub) на cubietruck + MegaD + 1-wire
CONNECT: http://connect.smartliving.ru/profile/311
Аватара пользователя
Kod.Begemot
Сообщения: 358
Зарегистрирован: Чт июн 20, 2013 5:53 pm
Благодарил (а): 32 раза
Поблагодарили: 42 раза

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

Сообщение Kod.Begemot » Пт янв 16, 2015 3:39 pm

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

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

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

$LinkedBridge= $this->getProperty('LinkedBridge');
callMethod($LinkedBridge.'.SetThermostat',array('port'=>1,'value'=>"21.5"));
P.S. я только учусь в этом языке, раньше только с Си дело имел. потому логику этого языка постигаю с трудом :)
zelevova
Сообщения: 291
Зарегистрирован: Вт ноя 18, 2014 11:43 pm
Откуда: Краснодарский край
Благодарил (а): 32 раза
Поблагодарили: 68 раз

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

Сообщение zelevova » Пт янв 16, 2015 3:55 pm

Условие для проверки указан ли слинкованный бридж. Если имя не заданно то и метод не вызовется. Можно как ты указал. Можно вообще получение реквизиты в вызов самого метода запихнуть. будет не совсем читаемо, зато в одну строку. :)
Это видимо привычка перепроверять заполненность реквизитов. :)
PS может port тоже в свойстве хранить?
Majordomo (GitHub) на cubietruck + MegaD + 1-wire
CONNECT: http://connect.smartliving.ru/profile/311
Аватара пользователя
Kod.Begemot
Сообщения: 358
Зарегистрирован: Чт июн 20, 2013 5:53 pm
Благодарил (а): 32 раза
Поблагодарили: 42 раза

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

Сообщение Kod.Begemot » Пт янв 16, 2015 4:19 pm

Да, конечно - порт тоже будет свойством.
Сейчас как-раз создаю объекты. пишу методы, получается на мой взгляд логично и как-то универсально, что-ли.

Вопрос - а если свойство не указано - то что произойдет в данном случае?
и ещё вопрос - вот вы писали что " нет проверки на опечатку в имени", а может можно как-то в условии проверять наличие такого объекта, какое имя указано?
Аватара пользователя
Bagir
Сообщения: 1614
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 375 раз

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

Сообщение Bagir » Пт янв 30, 2015 4:31 pm

Можно в цикле перебирать все объекты в поисках своего. Но для данной задачи это не целесообразно, сильно раздует код и увеличит процессорное время. Вообщем не советую. а вот условие if($LinkedBridge) {...} будет очень даже кстати. Даже если мы планируем, что эти свойства должны быть обязательны, все равно может быть ситуация, когда свойство не будет задано, и условие поможет корректно ее обойти.
У меня сейчас так все данные с объектов датчиков передаются объектам комнат.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Ответить