| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > call to a member function XX on a non-object in... |
| Автор: SergV 21.8.2014, 16:54 |
| Делаю шаблон для сайта, решил его сделать на отдельных макетах и блоках, так как сложный, и запнулся с ошибкой. Ситуация следующая, имеется файл индексный, в котором в самом начале подключаю файл с настройками, а в нём подключаю файл с классом, и этот клас инициализирую в файле настроек. Дальше всё просто, в индексном файле вызываю функцию подключение макета - $tpl->loadLayout('xxx'), и в подключенном макете вызываю функцию подключения блока(в) - $tpl->loadBlock('xxx'). Так вот, в индексном файле всё норм, вызываются функции без проблем, а в подключенном файле макета функция выдаёт ошибку, но при статическом вызове TPL::$tpl->loadBlock('xxx'), всё работает нормально. Пытался разобраться сам, но чего то не пойму, почему не передаётся объект в другой файл, который подключил... Я уже давно с пыхом не работал, а с классами и вообще подавно, и нагуглить чёт не вышло, английского не знаю, а на русском всё не по теме. Мож кто подскажет где проблема, чего не так делаю? ПС. Пых 5.4, локальный сервер OpenServer. Класс стандартный, с "парой" публичных функций, думаю смысла нет приводить, так как там не чего особо нет, кроме пары строк в каждой, да и всё работает в общем то, кроме файла макета... |
| Автор: SergV 21.8.2014, 17:23 | ||||
Имеется основной файл index.php шаблона...
В нём инклюдится файл настроек, в котором константы и т.д., и инклюд класса.
Там же в config.php и инициализация класса - $tpl = new TPL; Вызов идёт из index.php - $tpl->loadLayout('layout-name') В "layout-name" хтмл вёрстка и вызов блока - $tpl->loadBlock('block-name'), где оствшаяся хтмл вёрстка. Вот тут и выходит ошибка вызова функции, но если вызывать как TPL::$tpl->loadBlock('xxx'), то всё норм. Суть в том, что до переноса в класс, в config.php были просто две функции, и они вызывались без проблем, а в классе такая вот байда вышла... :( |
| Автор: baldina 21.8.2014, 17:46 | ||||||
$tpl недоступен отсюда. его надо передать в параметрах или, если он глобальный,
Добавлено через 38 секунд однако он будет доступен и так, только не через $tpl а через $this Добавлено через 10 минут и 33 секунды т.е.
|
| Автор: SergV 21.8.2014, 18:02 |
| Спасибо, чёт ступил, не попробовал через $this вызывать, думал не прокатит, тепрь работает. А попутный вопрос, можно как то так через $tpl делать, но не использовать global $tpl, так как вроде по старой памяти, глобалки не советуют из за проблем с защищённостью или чего там ещё? ПС. Интересно вообще, как функция в $this попала, если я класс инитиализировал как $tpl..., и не где не переопределял, и клас не наследуется не от какого другого. ПС2. Приколы, $this работает только для вызова из файла блоков в макете, а в индексном файле выдаёт туже ошибку. Мда..., хочется вызывать одинаково, а то там одно, тут другое. |
| Автор: baldina 21.8.2014, 19:02 | ||
| SergV, передать в качестве параметра. но... не надо через $tpl, логика следующая: контроллер создает $tpl - экземпляр TPL и работает с ним. $tpl - шаблон с исполняемым кодом, то есть view. код в partial temlates, подключаемых через loadLayout() и loadBlock() - суть часть кода view, поэтому ему логично обращаться к объекту шаблона (типа TPL), а значит view, как к себе, через $this Добавлено через 2 минуты и 22 секунды
ну естественно. блоки становятся частью кода функции-члена, а индексный файл - внешняя создающая и вызывающая среда. индексный файл - controller, блоки - часть view. view целиком представлен в индексном файле как $tpl |
| Автор: ksnk 22.8.2014, 07:32 | ||
Если я правильно понял, TPL - классический синглтон класс. Нужно и работать с ним как с синглтоном.
в нужных местах писать $tpl=TPL::getTpl() или TPL::getTpl()->do_something(); |
| Автор: Aliance 22.8.2014, 07:57 |
| ksnk, лучше наверное такой синглтон пометить как final, либо заменить self на static ;) |
| Автор: ksnk 22.8.2014, 09:21 |
| Aliance, Если разработчики php будут и дальше толкать язык в сторону Java - то нет, на static заменять не стоит Текст стырен откуда-то, вероятно с википедии, так что мопед не мой я на нем только катаюсь... |
| Автор: SergV 22.8.2014, 09:49 |
| baldina, сказать честно, понял через слово, совсем уже забыл что к чему в пхп, занимаясь 3д дизайном. Так или иначе, нашёл шаблон один, где подобная иеархия с подключением, правдо там всё идет через плагин(класс в плагине сидит), но в шаблоне везде вызов на подключение идёт как я писал... Попробую там подсмотреть что и как делается, и вытянуть что надо из плагина в шаблон. ksnk, спасибо за пример, но я с классами давным давно начинал работать, но так и не освоил толком, да и уже забыл что к чему. В общем придётся пока делать обходным путём, вызывая блоки через $this, и постепенно разбираться с найденным шаблоном и его плагином... Не вышло по быстрому сделать нормально, думал тряхну стариной, раз раз и на матрац, а $тут-> ПС. Глючит меня с утра, в найденом шаблоне точно так же, вызов макета через объявление класса и т.д., а подключение блоков через $this... В общем вопрос снимается, всем спасибо за ответы. |
| Автор: baldina 22.8.2014, 09:54 |
синглтон - потенциально проблемное место для расширения. поэтому в отсутствие достаточных доводов TPL лучше синглотоном не считать |