Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Проблема с передачей свойства потомку
Покинул форум
Сообщений всего: 5
Дата рег-ции: Нояб. 2009 Откуда: Киев, Украина
Помог: 0 раз(а)
В общем суть в том, что есть класс Application и в нём есть свойство $view_folder, которое передаётся потомку только если оно static. А вот если я в родителе его объявлю просто как
protected $view_folder, то его видимость пропадает как в потомке, так и в вызове функции render() родителя(хотя казалось бы, функция класса родителя и там это свойство само по себе должно быть видимо). Но оно становится NULL. При этом после окончания создания класса потомка и вызова его функции это свойство опять становится видимым
К методу родителя спокойно обращаюсь.
Как только объявил его как static, то всё заработало.
Почему так? Не могу понять. Извиняюсь за сумбурность объяснения, но вот так оно у меня в голове сейчас.
Ниже привожу код класса родителя Application и класса потомка Profile.
/* ВЫЗОВ МЕТОДА ИЗ РОДИТЕЛЯ, ГДЕ Я ХОЧУ ИМЕТЬ ВИДИМЫМ СВОЙСТВО $view_folder, НО ПОЧЕМУ ТОЛЬКО STATIC ? */
$this->render('index',[
"param1"=>"first",
"param2"=>"second",
]);
}
}
Спасибо всем, кто дочитал
andrewkard
Отправлено: 09 Октября, 2017 - 09:23:51
Участник
Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014
Помог: 30 раз(а)
А Вы уверены что при вызове метода рендер вызовется метод start() родителя?
логичнее было бы в конструкторе его вызвать, правда не видно всей архитектуры
Покинул форум
Сообщений всего: 5
Дата рег-ции: Нояб. 2009 Откуда: Киев, Украина
Помог: 0 раз(а)
А зачем мне метод start() на этапе компиляции? Profile - это такой себе контроллер, который вызывает метод render из родителя Application и с помощью этого метода рендерит страничку(сам метод и класс Render я еще не написал, но суть пока не в этом).
Для понимания всей архитектуры приведу её полный пример здесь.
Она простая как газета Правда
/* Подключаем нужные либы для старта и запускаем Aplication через метод start().
Я первый раз подобное пишу, возможно лучше было бы и конструктор просто сделать.
*/
require_once(__DIR__ .'/base/Application.php');
require_once(__DIR__ .'/base/Router.php');
$app=new Application();
$app->start();
Далее Application.php вычисляет куда мы обратились и передаёт строку в Router.
Хрен его знает как правильно, но написал как смог) Думаю потом у меня будет лучше получаться.
Роутер же возвращает controller и action к которым следует далее обратиться.
И вот к примеру обращаясь к engine.com/profile/index мы получим controller "profile" и action "index". В котроллере происходят определенные действия и в итоге надо сделать рендер всего этого дела.
Т.е. зная что контроллер у нас profile, то и вьюху будем искать в папке views/profile. Достаточно распространённый подход, как например в фреймворке Yii.
Так вот, я не могу понять, почему в Application.php если я использую свойство $view_folder не статически, то видимость его ограничена методом start()? Т.е. если оно не статическое, то я не могу написать в контроллере Profle $this->view_folder и получить результат. И в методе render(), который описан в классе Application(а вызывается из контроллера) я тоже не могу получить значение - $this->view_folder выдаёт NULL.
Структура папок в приложении имеет такой вид:
Пишу весь этот велосипед исключительно для себя и чтобы понять как работает та или иная фича.
Спасибо за помощь)
либо перенести содержимое старт в конструктор класса,
поправьте если не прав.
Neonion
Отправлено: 09 Октября, 2017 - 14:40:23
Новичок
Покинул форум
Сообщений всего: 5
Дата рег-ции: Нояб. 2009 Откуда: Киев, Украина
Помог: 0 раз(а)
А, т.е. когда я создаю класс контроллера Profile который наследует Application, то я одновременно создаю и новый экземпляр класса Application?
andrewkard
Отправлено: 09 Октября, 2017 - 14:55:05
Участник
Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014
Помог: 30 раз(а)
Neonion пишет:
то я одновременно создаю и новый экземпляр класса Application?
все же не совсем так, что там на самом деле происходит в памяти, нужно копать,
по крайней мере в память грузятся публичные или защищенные свойства и методы родителей, поскольку к ним имеем доступ.
И в данном случае похоже что свойство view == NULL
Neonion
Отправлено: 09 Октября, 2017 - 14:58:19
Новичок
Покинул форум
Сообщений всего: 5
Дата рег-ции: Нояб. 2009 Откуда: Киев, Украина
Помог: 0 раз(а)
Ну да, вот собственно и ответ похоже) Спасибо)
А как сам код выглядит, похоже на говнокодище или вполне сносно?))
andrewkard
Отправлено: 09 Октября, 2017 - 15:07:33
Участник
Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014
Помог: 30 раз(а)
Neonion пишет:
А как сам код выглядит, похоже на говнокодище или вполне сносно?))
смущает только что класс Profile наследуется от Application, а не от какого то общего контроллера для контроллеров действия
Neonion
Отправлено: 09 Октября, 2017 - 15:15:23
Новичок
Покинул форум
Сообщений всего: 5
Дата рег-ции: Нояб. 2009 Откуда: Киев, Украина
Помог: 0 раз(а)
Ок, понял. Подумаю еще раз над архитектурой...
Еще раз спасибо!
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.