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 :: Проблема со статичными методами/свойствами класс.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Вадим Васильев
Отправлено: 06 Апреля, 2017 - 17:23:35
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Апр. 2017  


Помог: 0 раз(а)




Доброго времени суток.
В общем есть код-шаблонизатора, написан в процедурном стиле. Хочу переписать его на ООП, но возникает множество вопросов, а точнее проблем. (весь код представленный ниже лишь легкий аналог, тк оригинал большой)

В процедурке код выглядит следующим образом:
PHP:
скопировать код в буфер обмена
  1.  
  2. $left_menu = [
  3.         ['title' => 'Запись', 'link' => 'order.php'],
  4.         ['title' => 'Избранное', 'link' => 'favorites.php'],
  5.         ['title' => 'Заявки', 'link' => 'orders.php']
  6. ];
  7. $variables = [
  8.         'index' => [
  9.                 'header' => renderPage('header'),
  10.                 'company_name' => 'Компания',
  11.                 'left_menu' => menuGenerator($left_menu),
  12.         ],
  13. ];
  14. function renderPage ($page,$variables = [])
  15. {
  16.         $file = TPL_DIR . $page . '.tpl';
  17.         $templateContent = '';
  18.         if(!is_file($file)){
  19.                 echo 'Шаблон ' . $file . ' не найден';
  20.                 exit;
  21.         }
  22.         if(filesize($file) === 0){
  23.                 echo 'Шаблон ' . $file . ' пустой';
  24.                 exit;
  25.         }
  26.         $templateContent = file_get_contents($file);
  27.         $tempVariables = [];
  28.         if(!empty($GLOBALS['variables'][$page])){
  29.                 $tempVariables = $GLOBALS['variables'][$page];
  30.         }
  31.         if(!empty($variables)) {
  32.                 foreach ($variables as $key => $value) {
  33.                         $tempVariables[$key] = $value;
  34.                 }
  35.         }
  36.         $variables = $tempVariables;
  37.         if(!empty($variables)){
  38.                 foreach ($variables as $key => $value) {
  39.                         if($value !== null && !is_array($value)){
  40.                                 $key = '{{' . strtoupper($key) . '}}';
  41.                                 $templateContent = str_replace($key, $value, $templateContent);
  42.                         }
  43.                 }
  44.         }
  45.         return $templateContent;
  46. }
  47. function menuGenerator($items)
  48. {
  49.         $result = '<ul class="nav navbar-nav">';
  50.         foreach ($items as $item) {
  51.                 $result .= '<li>';
  52.                 $result .= '<a href="' . $item['link'] . '">' . $item['title'] . '</a>';
  53.                 $result .= '</li>';
  54.         }
  55.         $result .= '</ul>';
  56.         return $result;
  57.  
  58.  


Пытаюсь перевести все в ООП. Создаю статичные свойства, которые через self:: вызывают статичный метод, статичный метод в свою очередь вызывает статичное свойство (только сейчас подумал что какая то путоница, но в процедурке работает как часы)
PHP:
скопировать код в буфер обмена
  1.  
  2. class Render
  3. {
  4.     public static $left_menu = [
  5.                 ['title' => 'Запись', 'link' => 'order.php'],
  6.                 ['title' => 'Избранное', 'link' => 'favorites.php'],
  7.                 ['title' => 'Заявки', 'link' => 'orders.php']
  8.         ];
  9.     public static $variables = [
  10.                 'index' => [
  11.                         'header' => self::renderPage('header'),
  12.                         'company_name' => 'Компания',
  13.                         'left_menu' => self::menuGenerator($left_menu),
  14.                 ],
  15.         ];
  16.         public static function renderPage ($page,$variables = [])
  17.         {
  18.                 $file = TPL_DIR . $page . '.tpl';
  19.                 $templateContent = '';
  20.                 if(!is_file($file)){
  21.                         echo 'Шаблон ' . $file . ' не найден';
  22.                         exit;
  23.                 }
  24.                 if(filesize($file) === 0){
  25.                         echo 'Шаблон ' . $file . ' пустой';
  26.                         exit;
  27.                 }
  28.                 $templateContent = file_get_contents($file);
  29.                 $tempVariables = [];
  30.                 if(!empty(self::$variables[$page])){
  31.                         $tempVariables = self::$variables[$page];
  32.                 }
  33.                 if(!empty($variables)) {
  34.                         foreach ($variables as $key => $value) {
  35.                                 $tempVariables[$key] = $value;
  36.                         }
  37.                 }
  38.                 $variables = $tempVariables;
  39.                 if(!empty($variables)){
  40.                         foreach ($variables as $key => $value) {
  41.                                 if($value !== null && !is_array($value)){
  42.                                         $key = '{{' . strtoupper($key) . '}}';
  43.                                         $templateContent = str_replace($key, $value, $templateContent);
  44.                                 }
  45.                         }
  46.                 }
  47.                 return $templateContent;
  48.         }
  49.         public static function menuGenerator($items)
  50.         {
  51.                 $result = '<ul class="nav navbar-nav">';
  52.                 foreach ($items as $item) {
  53.                         $result .= '<li>';
  54.                         $result .= '<a href="' . $item['link'] . '">' . $item['title'] . '</a>';
  55.                         $result .= '</li>';
  56.                 }
  57.                 $result .= '</ul>';
  58.                 return $result;
  59.         }
  60.         }
  61.  
  62. ?>
  63.  


В таком раскладе пыпыха ругается
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. Fatal error: Constant expression contains invalid operations
  3.  

ссылаясь на строку, закрывающую массив $variables

Я предположил что можно попробовать задать свойства через
PHP:
скопировать код в буфер обмена
  1.  
  2. public function __construct() {
  3.         $this->variables...
  4. }
  5.  

И в методе

И получил плюху в лоб, которая в принципе логична, тк я объект не создаю.
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. Fatal error: Uncaught Error: Using $this when not in object context in
  3.  


В общем наставьте меня на путь истинный. Сильно туплю, но хочу все понять.
 
 Top
Строитель
Отправлено: 06 Апреля, 2017 - 20:19:09
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Вадим Васильев попробуйте так
Спойлер (Отобразить)

(Добавление)
Вадим Васильев, и ещё - у вас в методе renderPage() есть пара exit'ов - вместо них пропишите пару return'ов.
 
 Top
quad
Отправлено: 06 Апреля, 2017 - 20:25:45
Post Id



Новичок


Покинул форум
Сообщений всего: 39
Дата рег-ции: Март 2017  
Откуда: Россия


Помог: 0 раз(а)




'header' => self::renderPage('header') зачем файл в массив суешь?
 
 Top
Вадим Васильев
Отправлено: 07 Апреля, 2017 - 12:42:30
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Апр. 2017  


Помог: 0 раз(а)




quad пишет:
'header' => self::renderPage('header') зачем файл в массив суешь?


В массив идет строка а не файл. Метод renderPage возвращает строку с html
(Добавление)
Строитель пишет:
Вадим Васильев попробуйте так
Спойлер (Отобразить)

(Добавление)
Вадим Васильев, и ещё - у вас в методе renderPage() есть пара exit'ов - вместо них пропишите пару return'ов.



Та же ошибка
CODE (text):
скопировать код в буфер обмена
  1.  
  2. Fatal error: Uncaught Error: Access to undeclared static property: Render::$variables
  3.  

Ведь если я вызываю свойства/методы статчно то __construct не запускается..
 
 Top
Строитель
Отправлено: 07 Апреля, 2017 - 13:11:38
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Вадим Васильев, точно - это я не учёл. Тогда почему именно статические свойства и методы? Напишите обычный класс. В чем проблема? Вы не хотите создавать экземпляр класса вне класса?
 
 Top
Вадим Васильев
Отправлено: 07 Апреля, 2017 - 14:03:57
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Апр. 2017  


Помог: 0 раз(а)




Строитель пишет:
Вадим Васильев, точно - это я не учёл. Тогда почему именно статические свойства и методы? Напишите обычный класс. В чем проблема? Вы не хотите создавать экземпляр класса вне класса?


Не то что бы не хочу Закатив глазки.. Просто, думал, вдруг, есть статичный способ Закатив глазки
Скорее для общего развития, нежели из-за какого-то принципа.
 
 Top
Строитель
Отправлено: 08 Апреля, 2017 - 10:41:29
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Вадим Васильев пишет:
Строитель пишет:
Вадим Васильев, точно - это я не учёл. Тогда почему именно статические свойства и методы? Напишите обычный класс. В чем проблема? Вы не хотите создавать экземпляр класса вне класса?


Не то что бы не хочу Закатив глазки.. Просто, думал, вдруг, есть статичный способ Закатив глазки
Скорее для общего развития, нежели из-за какого-то принципа.
Есть и статичный способ
Спойлер (Отобразить)

(Добавление)
И ещё - скорее всего в теле метода renderPage() все переменные $variables нужно будет заменить на свойство self::$variables.

(Отредактировано автором: 08 Апреля, 2017 - 10:58:44)

 
 Top
Вадим Васильев
Отправлено: 10 Апреля, 2017 - 12:48:19
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Апр. 2017  


Помог: 0 раз(а)




Строитель, спасибо) Это гениально!) Просто и гениально, я даже не подумал что достаточно создать статичный метод конструктора) Не могу сказать "спасибо", недостаточно комментариев
(Добавление)
Пораскинув мозгами пришел к выводу переделать слегка функционал. Теперь свойство $variables используется а-ля кэш. Вместо него есть метод variablesInit($key) который через свитч либо ищет в $variables данные либо генерит их, сохраняет в $variales и возвращает.
 
 Top
Строитель
Отправлено: 10 Апреля, 2017 - 14:16:53
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Вадим Васильев пишет:
Это гениально!) Просто и гениально
На самом деле это обычный принцип работы ооп Радость В этом конкретном примере идёт обращение из публичного статического метода к приватному статическому свойству.
 
 Top
Вадим Васильев
Отправлено: 10 Апреля, 2017 - 16:50:49
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Апр. 2017  


Помог: 0 раз(а)




Строитель, Фишка в том что это статичный псевдоконструктор Голливудская улыбка
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB