Форумы портала PHP.SU » » Объектно-ориентированное программирование » Проблема со статичными методами/свойствами класс.

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

1. Вадим Васильев - 06 Апреля, 2017 - 17:23:35 - перейти к сообщению
Доброго времени суток.
В общем есть код-шаблонизатора, написан в процедурном стиле. Хочу переписать его на ООП, но возникает множество вопросов, а точнее проблем. (весь код представленный ниже лишь легкий аналог, тк оригинал большой)

В процедурке код выглядит следующим образом:
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.  

И в методе
PHP:
скопировать код в буфер обмена
  1.  
  2. $this->variables[$page]
  3.  

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


В общем наставьте меня на путь истинный. Сильно туплю, но хочу все понять.
2. Строитель - 06 Апреля, 2017 - 20:19:09 - перейти к сообщению
Вадим Васильев попробуйте так
Спойлер (Отобразить)

(Добавление)
Вадим Васильев, и ещё - у вас в методе renderPage() есть пара exit'ов - вместо них пропишите пару return'ов.
3. quad - 06 Апреля, 2017 - 20:25:45 - перейти к сообщению
'header' => self::renderPage('header') зачем файл в массив суешь?
4. Вадим Васильев - 07 Апреля, 2017 - 12:42:30 - перейти к сообщению
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 не запускается..
5. Строитель - 07 Апреля, 2017 - 13:11:38 - перейти к сообщению
Вадим Васильев, точно - это я не учёл. Тогда почему именно статические свойства и методы? Напишите обычный класс. В чем проблема? Вы не хотите создавать экземпляр класса вне класса?
6. Вадим Васильев - 07 Апреля, 2017 - 14:03:57 - перейти к сообщению
Строитель пишет:
Вадим Васильев, точно - это я не учёл. Тогда почему именно статические свойства и методы? Напишите обычный класс. В чем проблема? Вы не хотите создавать экземпляр класса вне класса?


Не то что бы не хочу Закатив глазки.. Просто, думал, вдруг, есть статичный способ Закатив глазки
Скорее для общего развития, нежели из-за какого-то принципа.
7. Строитель - 08 Апреля, 2017 - 10:41:29 - перейти к сообщению
Вадим Васильев пишет:
Строитель пишет:
Вадим Васильев, точно - это я не учёл. Тогда почему именно статические свойства и методы? Напишите обычный класс. В чем проблема? Вы не хотите создавать экземпляр класса вне класса?


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

(Добавление)
И ещё - скорее всего в теле метода renderPage() все переменные $variables нужно будет заменить на свойство self::$variables.
8. Вадим Васильев - 10 Апреля, 2017 - 12:48:19 - перейти к сообщению
Строитель, спасибо) Это гениально!) Просто и гениально, я даже не подумал что достаточно создать статичный метод конструктора) Не могу сказать "спасибо", недостаточно комментариев
(Добавление)
Пораскинув мозгами пришел к выводу переделать слегка функционал. Теперь свойство $variables используется а-ля кэш. Вместо него есть метод variablesInit($key) который через свитч либо ищет в $variables данные либо генерит их, сохраняет в $variales и возвращает.
9. Строитель - 10 Апреля, 2017 - 14:16:53 - перейти к сообщению
Вадим Васильев пишет:
Это гениально!) Просто и гениально
На самом деле это обычный принцип работы ооп Радость В этом конкретном примере идёт обращение из публичного статического метода к приватному статическому свойству.
10. Вадим Васильев - 10 Апреля, 2017 - 16:50:49 - перейти к сообщению
Строитель, Фишка в том что это статичный псевдоконструктор Голливудская улыбка

 

Powered by ExBB FM 1.0 RC1