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
Форумы портала PHP.SU :: Версия для печати :: Урок №19 - Немного о паттернах [5]
Форумы портала PHP.SU » PHP » Уроки php » Урок №19 - Немного о паттернах

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

61. vlom - 09 Декабря, 2011 - 18:51:11 - перейти к сообщению
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

А потом уже выполняется функция
62. EuGen - 09 Декабря, 2011 - 19:20:41 - перейти к сообщению
В представлении допустимо использовать построение логики вывода (в Вашем случае это вывод в три колонки). Ведь оно для того и представление, что содержит в себе способ вывода контента. Представление оперирует свойством $rgPages, полученном в контроллере, так что все стройно - логика отображения отделена от операций с данными.
Насчет layout предлагаю все же подумать.
63. vlom - 09 Декабря, 2011 - 19:32:11 - перейти к сообщению
Допустим ли такой вариант как с использованием класса Config_Handler??? То есть добавить функцию в класс для создания объекта, но при этом получается что выскакивает ошибка о повторном старте сессии. В Controller_Base заменил session_start() на

(Добавление)
Вроде работает без выпендрежа пока)))
64. Panoptik - 09 Декабря, 2011 - 20:05:17 - перейти к сообщению
я вот просмотрел статью и у меня накопилось несколько вопросов.

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 рисует какой либо файл вида и вставляет в лейаут. вопрос: у вас здесь просто пока не реализована возможность добавления нескольких файлов вида, допустим отрендерить меню с одного файла и контент с другого? или после каждого вызова рендер идет кеширование содержимого, а после происходит вывод всего что накопилось. и если можно ткнуть пальцем в то место где это происходит
65. Мелкий - 09 Декабря, 2011 - 20:17:28 - перейти к сообщению
Panoptik пишет:
1 простой: названия переменных всегда несут в себе какуюто суть. у вас я часто встречаю префикс "rg" - пока до сих пор не додумал что бы это могло означать

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

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

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

А конструктор (__construct) класса, метод клонирования (__clone) объявляются private - это как раз механизм защиты от создания нового экземпляра объекта.
66. EuGen - 09 Декабря, 2011 - 20:19:34 - перейти к сообщению
1. Это не более чем моя система неймспейсинга. rg означает переменную-массив (от "register")
2. Это не защита, а реализация паттерна. В строгом смысле объект можно склонировать, создать новый и т.п. Предполагается что программист сам себе не враг и не будет использовать объект против его реализации. Но можно добавить и "защиту" - запретить конструктор, клонирование (сделать их приватными) и т.п.
3. Обертка (layout) в настоящее время одна. Так что предполагается, что при надобности можно модифицировать класс, отвечающий за представление.
67. Panoptik - 09 Декабря, 2011 - 20:40:36 - перейти к сообщению
на счет синглтона.
всё до боли уж абстрактно
если на небольшом примере
в реальном приложении у нас гдето встречается явное создание объекта класса синглтон?

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

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

Спойлер (Отобразить)
68. EuGen - 09 Декабря, 2011 - 20:51:41 - перейти к сообщению
Не путайте protected и private. Первый доступен потомкам, второй - нет.
69. Panoptik - 09 Декабря, 2011 - 20:55:00 - перейти к сообщению
правильно, поэтому я и спрашиваю
вот же ваш код:
PHP:
скопировать код в буфер обмена
  1.  
  2.     static protected $rInstance = null;
  3.  
70. EuGen - 09 Декабря, 2011 - 20:57:44 - перейти к сообщению
Так он и есть protected, не private - все верно. К статичному свойству можно обращаться через self.
Но в данном случае не очень понял про абстракцию. Есть экземпляр класса - возвращаемые в getInstance - и это вполне конкретный класс, вполне конкретный его экземпляр, который можно использовать. Здесь нет никакой абстракции.
71. Panoptik - 09 Декабря, 2011 - 21:03:14 - перейти к сообщению
сорри со словоблудие "абстрактно" я имел ввиду свое личное понимание, а не модификатор принятый в php Улыбка

значит когда мы в наследниках вызовем Someclass::getInstance() мы получим экземпляр именно Someclass, который ранее был создан с помощью $Someclass = new Someclass;
я всё верно понял надеюсь
72. EuGen - 09 Декабря, 2011 - 21:08:20 - перейти к сообщению
Чтобы ответить на этот вопрос, посмотрите реализацию адаптера к БД. Там есть такое же наследование.
73. vlom - 25 Декабря, 2011 - 17:45:53 - перейти к сообщению
Переделал функцию 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'
что не так в моем коде?? Да и вообще как-то коряво реализованна загрузка контроллеров если нет названия метода в ссылке, может подскажите как будет лучше такое осуществить. Просто есть старый проиндексированный сайт и ни как не желаю менять ссылки.
74. vlom - 28 Февраля, 2012 - 05:34:11 - перейти к сообщению
EuGen у вас в Controller_Base в методе конструктора стартуется сессия, в таком случае как показанно в примере она не будет каждый раз новая запускаться??? Вот так не правильнее будет
75. EuGen - 28 Февраля, 2012 - 08:05:39 - перейти к сообщению
vlom
http://www.php.su/functions/?session_start пишет:
session_start() создаёт сессию (или продолжает текущую на основе session id, переданного через GET-переменную или куку).

 

Powered by ExBB FM 1.0 RC1