Выполнение метода во всем классе. Цикл. Проблема. :?:

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

Модератор: immortal

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

Выполнение метода во всем классе. Цикл. Проблема. :?:

Сообщение Kod.Begemot » Пн авг 22, 2016 12:19 am

Доброго времени суток, камрады!
Есть у меня проблемка:
Есть класс "Light", в нем классы вложенные "PWM", и "Relay".
В каждом из этих классов есть метод "Refresh", так вот, когда я делаю выборку объектов класса "Light", и выполнение метода "Refresh" - получаю ошибку "Call to a member function callMethod() on a non-object in..."
Если я делаю выборку из конкретно подкласса "PWM" - то все работает. Если делаю выборку из "Relay" - то та же ошибка.

выборку делаю вот так:

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

$objects=getObjectsByClass("Relay");
foreach($objects as $obj) {
 $obj1=getObject($obj['TITLE']);
$obj1->callMethod("Refresh");
} 
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Выполнение метода во всем классе. Цикл. Проблема. :?:

Сообщение nick7zmail » Пн авг 22, 2016 6:34 am

Метод классовый у Light? или у каждого подкласса свой?
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Аватара пользователя
Kod.Begemot
Сообщения: 358
Зарегистрирован: Чт июн 20, 2013 5:53 pm
Благодарил (а): 32 раза
Поблагодарили: 42 раза

Re: Выполнение метода во всем классе. Цикл. Проблема. :?:

Сообщение Kod.Begemot » Пн авг 22, 2016 8:30 am

У каждого - свой.
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Выполнение метода во всем классе. Цикл. Проблема. :?:

Сообщение nick7zmail » Пн авг 22, 2016 10:03 am

Попробуйте конструкцию

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

callMethod($obj['TITLE'].'.Refresh');
вместо

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

$obj1->callMethod("Refresh");
Честно не знаю, поможет/нет...просто как альтернативный вариант. Может какие-то затупки из-за вложенных классов... А тут напрямую объект-метод вызывается.
Последний раз редактировалось nick7zmail Пн авг 22, 2016 10:08 am, всего редактировалось 1 раз.
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Аватара пользователя
Kod.Begemot
Сообщения: 358
Зарегистрирован: Чт июн 20, 2013 5:53 pm
Благодарил (а): 32 раза
Поблагодарили: 42 раза

Re: Выполнение метода во всем классе. Цикл. Проблема. :?:

Сообщение Kod.Begemot » Пн авг 22, 2016 10:06 am

Да уже попробовал (нашел подобную рекомендацию поиском), но пока ничего это не дало.
"Call to a member function callMethod() on a non-object in"
Попробую сейчас с пустым методом "Refresh" в классе Relay...
P.S. Без всяких циклов метод этот работает, если его "вручную" запустить...
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Выполнение метода во всем классе. Цикл. Проблема. :?:

Сообщение nick7zmail » Пн авг 22, 2016 10:14 am

А это весь код ошибки?
Kod.Begemot писал(а):non-object in..."
Что за троеточием? Суть то понятна - ругается то что пытается вызвать callMethod() без объекта. То есть имя объекта возможно пустое или еще что-то. Надо подебажить $obj['TITLE']. Возможно у вас в классе Relays есть какие-то "фантомные объекты" с пустым именем...
Последний раз редактировалось nick7zmail Пн авг 22, 2016 10:16 am, всего редактировалось 1 раз.
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Аватара пользователя
Kod.Begemot
Сообщения: 358
Зарегистрирован: Чт июн 20, 2013 5:53 pm
Благодарил (а): 32 раза
Поблагодарили: 42 раза

Re: Выполнение метода во всем классе. Цикл. Проблема. :?:

Сообщение Kod.Begemot » Пн авг 22, 2016 10:15 am

Fatal error: Call to a member function callMethod() on a non-object in C:\_majordomo\htdocs\modules\objects\objects.class.php(514) : eval()'d code on line 9

Просто я привык, что в подобных сообщениях мало толку - номер строки точно не отражает реального положения дел, как я понимаю...
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Выполнение метода во всем классе. Цикл. Проблема. :?:

Сообщение nick7zmail » Пн авг 22, 2016 10:21 am

Kod.Begemot писал(а):Fatal error: Call to a member function callMethod() on a non-object in C:\_majordomo\htdocs\modules\objects\objects.class.php(514) : eval()'d code on line 9

Просто я привык, что в подобных сообщениях мало толку - номер строки точно не отражает реального положения дел, как я понимаю...
Номер строки как раз таки очень часто выручает)) но не в этом случае))). Говорю, дебажить надо что хранится в $obj['TITLE'] на каждом цикле foreach. Возможно туда что-то пустое в один момент прилетает, и вываливается ошибка. Или ошибка присвоения obj1 - тип данных не сходится...попробуйте напрямую

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

$objects=getObjectsByClass("Relay");
foreach($objects as $obj) {
callMethod($obj['TITLE'].'.Refresh');
}  
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Аватара пользователя
Kod.Begemot
Сообщения: 358
Зарегистрирован: Чт июн 20, 2013 5:53 pm
Благодарил (а): 32 раза
Поблагодарили: 42 раза

Re: Выполнение метода во всем классе. Цикл. Проблема. :?:

Сообщение Kod.Begemot » Пн авг 22, 2016 10:29 am

ага, ну это попробую...
debmes("$obj['TITLE']");
правильная конструкция?
P.S. с пустым методом в классе Relay ошибку не выдал...
если в методе просто строка say("test"); то выдает в лог 5 (по количеству объектов в классе) сообщений "test".
вот код метода Refresh этого класса:

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

$Status=$this->getProperty("Status");
if ($Status) {
 $this->callMethod('TurnOn');
} else {
 $this->callMethod('TurnOff');
} 
но ошибку получаю даже если упрощаю просто до

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

 $this->callMethod('TurnOn'); 
Ощущение, что проблема в этом самом "$this"...

P.P.S. попробовал

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

$objects=getObjectsByClass("Relay");
foreach($objects as $obj) {
callMethod($obj['TITLE'].'.Refresh');
}
но ничего не изменилось...
P.P.P.S.
вот код метода из класса "PWM", где все работает:

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

$Bright=$this->getProperty("BrightCurrent");
$LinkedMegaName=$this->getProperty("LinkedMegaName");
$LinkedMegaPort=$this->getProperty("LinkedMegaPort");

$obj=getObject($LinkedMegaName);
$obj->callMethod("setPWM",array('port'=>$LinkedMegaPort,'value'=>$Bright,'speed'=>0)); 
Значит наверное в этом контексте получается конструкция "$this->" не работает, ибо указывает куда-то не туда?
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Выполнение метода во всем классе. Цикл. Проблема. :?:

Сообщение nick7zmail » Пн авг 22, 2016 10:41 am

Ну вот...выяснили...косяк в самом методе Refresh когда он вызывает callMethod('TurnOn');...чисто в порядке бреда попробуй

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

$this->callMethod("TurnOn"); //поменял кавычки, если что))    
И ещё вариант

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

$this->callMethod("TurnOn", ); 
UPD: Мне кажется проблема в том, что ты вызываешь метод рефреш, а он уже вызывает метод он или офф, и в этом моменте теряется привязка к $this. Можно в метод Рефреш передавать как один из параметров имя объекта, а в методе рефреш вызывать уже не через $this а

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

cm($params['NAME'].'.TurnOn'); 
Последний раз редактировалось nick7zmail Пн авг 22, 2016 10:51 am, всего редактировалось 3 раза.
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Ответить