Страница 1 из 2
Выполнение метода во всем классе. Цикл. Проблема. :?:
Добавлено: Пн авг 22, 2016 12:19 am
Kod.Begemot
Доброго времени суток, камрады!
Есть у меня проблемка:
Есть класс "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");
}
Re: Выполнение метода во всем классе. Цикл. Проблема. :?:
Добавлено: Пн авг 22, 2016 6:34 am
nick7zmail
Метод классовый у Light? или у каждого подкласса свой?
Re: Выполнение метода во всем классе. Цикл. Проблема. :?:
Добавлено: Пн авг 22, 2016 8:30 am
Kod.Begemot
У каждого - свой.
Re: Выполнение метода во всем классе. Цикл. Проблема. :?:
Добавлено: Пн авг 22, 2016 10:03 am
nick7zmail
Попробуйте конструкцию
вместо
Честно не знаю, поможет/нет...просто как альтернативный вариант. Может какие-то затупки из-за вложенных классов... А тут напрямую объект-метод вызывается.
Re: Выполнение метода во всем классе. Цикл. Проблема. :?:
Добавлено: Пн авг 22, 2016 10:06 am
Kod.Begemot
Да уже попробовал (нашел подобную рекомендацию поиском), но пока ничего это не дало.
"Call to a member function callMethod() on a non-object in"
Попробую сейчас с пустым методом "Refresh" в классе Relay...
P.S. Без всяких циклов метод этот работает, если его "вручную" запустить...
Re: Выполнение метода во всем классе. Цикл. Проблема. :?:
Добавлено: Пн авг 22, 2016 10:14 am
nick7zmail
А это весь код ошибки?
Kod.Begemot писал(а):non-object in..."
Что за троеточием? Суть то понятна - ругается то что пытается вызвать callMethod() без объекта. То есть имя объекта возможно пустое или еще что-то. Надо подебажить $obj['TITLE']. Возможно у вас в классе Relays есть какие-то "фантомные объекты" с пустым именем...
Re: Выполнение метода во всем классе. Цикл. Проблема. :?:
Добавлено: Пн авг 22, 2016 10:15 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
Просто я привык, что в подобных сообщениях мало толку - номер строки точно не отражает реального положения дел, как я понимаю...
Re: Выполнение метода во всем классе. Цикл. Проблема. :?:
Добавлено: Пн авг 22, 2016 10:21 am
nick7zmail
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');
}
Re: Выполнение метода во всем классе. Цикл. Проблема. :?:
Добавлено: Пн авг 22, 2016 10:29 am
Kod.Begemot
ага, ну это попробую...
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"...
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->" не работает, ибо указывает куда-то не туда?
Re: Выполнение метода во всем классе. Цикл. Проблема. :?:
Добавлено: Пн авг 22, 2016 10:41 am
nick7zmail
Ну вот...выяснили...косяк в самом методе Refresh когда он вызывает callMethod('TurnOn');...чисто в порядке бреда попробуй
Код: Выделить всё
$this->callMethod("TurnOn"); //поменял кавычки, если что))
И ещё вариант
UPD: Мне кажется проблема в том, что ты вызываешь метод рефреш, а он уже вызывает метод он или офф, и в этом моменте теряется привязка к $this. Можно в метод Рефреш передавать как один из параметров имя объекта, а в методе рефреш вызывать уже не через $this а