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 :: Урок №19 - Немного о паттернах [5]

 PHP.SU

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


 Страниц (7): « 1 2 3 4 [5] 6 7 » 

> Описание: Архитектура MVC своими руками.
vlom
Отправлено: 09 Декабря, 2011 - 18:51:11
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 681
Дата рег-ции: Окт. 2010  
Откуда: Екатеринбург


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




EuGen пишет:
Будет представление, которое обращается к переменной $rgPages

по моему я опять ухожу в лес дремучий, у меня получается в представлении весь код для обработки контента. К примеру, мне необходимо отобразить три колонки получается вот так вот.
PHP:
скопировать код в буфер обмена
  1.  
  2. for($i = 0; $i < count($this->rgPages); $i = $i+3){
  3.     if(!empty($this->rgPages[$i])) echo $this->rgPages[$i]['id'].' ';
  4.     if(!empty($this->rgPages[$i + 1])) echo $this->rgPages[$i + 1]['id'].' ';
  5.     if(!empty($this->rgPages[$i + 2])) echo $this->rgPages[$i + 2]['id'].'<br />';
  6. }
  7.  

(Добавление)
прибавить остальные поля из базы и html код то вообще получится как всегда соберушка
(Добавление)
и еще могу я из представления layuot.php обратится к какаому либо контролеру для получения информации???
(Добавление)
Если использовать такой к примеру способ

Сначала вылазит ошибка
CODE (htmlphp):
скопировать код в буфер обмена
  1. Strict standards: Non-static method Controller_Index::test() should not be called statically, assuming $this from incompatible context in C:\xampp\htdocs\coding.dev\www\templates\main.php on line 28

А потом уже выполняется функция
 
 Top
EuGen Администратор
Отправлено: 09 Декабря, 2011 - 19:20:41
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




В представлении допустимо использовать построение логики вывода (в Вашем случае это вывод в три колонки). Ведь оно для того и представление, что содержит в себе способ вывода контента. Представление оперирует свойством $rgPages, полученном в контроллере, так что все стройно - логика отображения отделена от операций с данными.
Насчет layout предлагаю все же подумать.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
vlom
Отправлено: 09 Декабря, 2011 - 19:32:11
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 681
Дата рег-ции: Окт. 2010  
Откуда: Екатеринбург


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




Допустим ли такой вариант как с использованием класса Config_Handler??? То есть добавить функцию в класс для создания объекта, но при этом получается что выскакивает ошибка о повторном старте сессии. В Controller_Base заменил session_start() на

(Добавление)
Вроде работает без выпендрежа пока)))
 
 Top
Panoptik
Отправлено: 09 Декабря, 2011 - 20:05:17
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


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




я вот просмотрел статью и у меня накопилось несколько вопросов.

1 простой: названия переменных всегда несут в себе какуюто суть. у вас я часто встречаю префикс "rg" - пока до сих пор не додумал что бы это могло означать

2: в чем проявляется реализация паттерна синглтон. насколько я понял логика такова, что у класса есть механизм защиты от создания второго экземпляра, только вот где именно это реализовано, пока не понял. предполагаю приблизительно вот в этом месте:
PHP:
скопировать код в буфер обмена
  1. public static function getInstance()
  2.     {
  3.         if(!parent::$rInstance)
  4.         {
  5.             parent::$rInstance    = new Db_Sqlite_Adapter();
  6.         }
  7.         return parent::$rInstance;
  8.     }


3: логика вывода. render рисует какой либо файл вида и вставляет в лейаут. вопрос: у вас здесь просто пока не реализована возможность добавления нескольких файлов вида, допустим отрендерить меню с одного файла и контент с другого? или после каждого вызова рендер идет кеширование содержимого, а после происходит вывод всего что накопилось. и если можно ткнуть пальцем в то место где это происходит


-----
Just do it
 
 Top
Мелкий Супермодератор
Отправлено: 09 Декабря, 2011 - 20:17:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Panoptik пишет:
1 простой: названия переменных всегда несут в себе какуюто суть. у вас я часто встречаю префикс "rg" - пока до сих пор не додумал что бы это могло означать

Массив, образовано от register, сам недавно спрашивал Закатив глазки

Panoptik пишет:
2: в чем проявляется реализация паттерна синглтон. насколько я понял логика такова, что у класса есть механизм защиты от создания второго экземпляра, только вот где именно это реализовано, пока не понял. предполагаю приблизительно вот в этом месте:

Это - непосредственно метод получения единственного экземпляра. $rInstance - единое свойство для всех экземпляров класса, т.е. все экземпляры имеют одинаковое значение.

А конструктор (__construct) класса, метод клонирования (__clone) объявляются private - это как раз механизм защиты от создания нового экземпляра объекта.


-----
PostgreSQL DBA
 
 Top
EuGen Администратор
Отправлено: 09 Декабря, 2011 - 20:19:34
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




1. Это не более чем моя система неймспейсинга. rg означает переменную-массив (от "register")
2. Это не защита, а реализация паттерна. В строгом смысле объект можно склонировать, создать новый и т.п. Предполагается что программист сам себе не враг и не будет использовать объект против его реализации. Но можно добавить и "защиту" - запретить конструктор, клонирование (сделать их приватными) и т.п.
3. Обертка (layout) в настоящее время одна. Так что предполагается, что при надобности можно модифицировать класс, отвечающий за представление.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Panoptik
Отправлено: 09 Декабря, 2011 - 20:40:36
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


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




на счет синглтона.
всё до боли уж абстрактно
если на небольшом примере
в реальном приложении у нас гдето встречается явное создание объекта класса синглтон?

вот вроде логику ООП понимаю, но видать не на столько.
свойство $rInstance статичное и в то же время протектед. если оно статичное, то его же нельзя вызвать через $this в классе наследнике?

будем отталкиваться от этого класса:

Спойлер (Отобразить)

(Отредактировано автором: 09 Декабря, 2011 - 20:42:22)



-----
Just do it
 
 Top
EuGen Администратор
Отправлено: 09 Декабря, 2011 - 20:51:41
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Не путайте protected и private. Первый доступен потомкам, второй - нет.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Panoptik
Отправлено: 09 Декабря, 2011 - 20:55:00
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


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




правильно, поэтому я и спрашиваю
вот же ваш код:
PHP:
скопировать код в буфер обмена
  1.  
  2.     static protected $rInstance = null;
  3.  


-----
Just do it
 
 Top
EuGen Администратор
Отправлено: 09 Декабря, 2011 - 20:57:44
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Так он и есть protected, не private - все верно. К статичному свойству можно обращаться через self.
Но в данном случае не очень понял про абстракцию. Есть экземпляр класса - возвращаемые в getInstance - и это вполне конкретный класс, вполне конкретный его экземпляр, который можно использовать. Здесь нет никакой абстракции.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Panoptik
Отправлено: 09 Декабря, 2011 - 21:03:14
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


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




сорри со словоблудие "абстрактно" я имел ввиду свое личное понимание, а не модификатор принятый в php Улыбка

значит когда мы в наследниках вызовем Someclass::getInstance() мы получим экземпляр именно Someclass, который ранее был создан с помощью $Someclass = new Someclass;
я всё верно понял надеюсь


-----
Just do it
 
 Top
EuGen Администратор
Отправлено: 09 Декабря, 2011 - 21:08:20
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Чтобы ответить на этот вопрос, посмотрите реализацию адаптера к БД. Там есть такое же наследование.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
vlom
Отправлено: 25 Декабря, 2011 - 17:45:53
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 681
Дата рег-ции: Окт. 2010  
Откуда: Екатеринбург


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




Переделал функцию run() немного
PHP:
скопировать код в буфер обмена
  1.     function run() {
  2.         $uri = $this->getURI();
  3.         foreach ($this->routes as $route => $destination) {
  4.             if (preg_match($route, $uri)) {
  5.                 $internalRoute = preg_replace($route, $destination, $uri);
  6.                 $segments = explode('/', $internalRoute);
  7.                 $controller = 'Controller_' . ucfirst(array_shift($segments));
  8.                 //launch controller:
  9.                 if (class_exists($controller)&& $uri != 'index.php') {
  10.                     if ($controller == 'Controller_News') {
  11.                         $parameters = $segments;
  12.                         $this->_load_method($controller, 'showAction', $parameters);
  13.                         return;
  14.                     } else {
  15.                         $obj = new $controller;
  16.                         $method = array_shift($segments) . 'Action';
  17.                         $parameters = $segments;
  18.                         if (method_exists($obj, $method)) {
  19.                             call_user_func_array(array($obj, $method), $parameters);
  20.                             return;
  21.                         } else {
  22.                                 $this->_default_error();
  23.                         }
  24.                     }
  25.                 } else {
  26.                     $parameters = $segments;
  27.                     $this->_load_method('Controller_Content', 'showAction', $parameters);
  28.                     return;
  29.                 }
  30.             }
  31.         }
  32.         return;
  33.     }

если переходить по ссылке news/1/3 в переменной $parametrs остается только лишь '1'
что не так в моем коде?? Да и вообще как-то коряво реализованна загрузка контроллеров если нет названия метода в ссылке, может подскажите как будет лучше такое осуществить. Просто есть старый проиндексированный сайт и ни как не желаю менять ссылки.
 
 Top
vlom
Отправлено: 28 Февраля, 2012 - 05:34:11
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 681
Дата рег-ции: Окт. 2010  
Откуда: Екатеринбург


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




EuGen у вас в Controller_Base в методе конструктора стартуется сессия, в таком случае как показанно в примере она не будет каждый раз новая запускаться??? Вот так не правильнее будет
 
 Top
EuGen Администратор
Отправлено: 28 Февраля, 2012 - 08:05:39
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




vlom
http://www.php.su/functions/?session_start пишет:
session_start() создаёт сессию (или продолжает текущую на основе session id, переданного через GET-переменную или куку).


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (7): « 1 2 3 4 [5] 6 7 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Уроки php »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB