Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2012, 17:30   #11
Cronos20
Форумчанин
 
Регистрация: 08.07.2010
Сообщений: 679
По умолчанию

Поймите, что невозможно описать полностью структуру такого приложения и имеет ли смысл, когда куча примеров.
Для начала все глобальные классы - объекты сделайте сингтонами (всякие кэши, конфиги и роутеры)
Паттерн factory должен возвращать объекты
Делайте вызовы классов и методов с более очевидными параметрами: вы через день на вскидку вспомните как получить хоть что-то из метода не заглядывая в его код?
Код:
factory($type=NULL, $save=NULL, $array=NULL)
А нужно :
Код:
Factory::get("Cache")->save();
Наследуйте классы
Код:
class Cache{}
class ConfigCache extends Cache{}
class PageCache extends Cache{}
А так пока у вас ООП ради ООП
Код:
global $_SESSION;  // что ЭТО ?)))))
Главное - перед тем как создавать класс и писать его методы, подумайте как его проще будет использовать и вызывать методы !!! Отсюда и отталкивайтесь.
Любой фреймворк создан не для того чтобы нагрмоздить кучу классов, а чтобы ими можно было легко пользоваться и интуитивно понимать.
Сравните например свое
Код:
DF_cache::factory("Page", "Session", array(ля-ля-ля))
И абстрактное
Код:
PageCache::getInstance()->save("Session")
Cronos20 вне форума Ответить с цитированием
Старый 16.03.2012, 17:32   #12
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
По умолчанию

про namespaces знаю. Былобы интересно увидеть пример такого кода. Ну например мне понравилось как в зенде монжно все подключать.

Но вот аналога пока непридумал. В интернете куча примеров спросто замены класа на неймспейсы. Давно о них думал.

Сейчас вот накидаю структуру системы. Покаже еще некоторые моменты, попытаюсь обяснить как оно работает.

PS: global $_SESSION; // что ЭТО ?))))) Гдето ведать застряло. Неувидел
dem66 вне форума Ответить с цитированием
Старый 16.03.2012, 17:36   #13
Cronos20
Форумчанин
 
Регистрация: 08.07.2010
Сообщений: 679
По умолчанию

Что делает функция arrayToObject($array) в классе DF_Config ? Выносите такое во всякие вспомогательные хелперы
Cronos20 вне форума Ответить с цитированием
Старый 16.03.2012, 17:42   #14
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
По умолчанию

Зачем она там если она используется только в этом класе и нигде больше? Она переводит массив в объект. Дается возможность работать с массивом как с объектом. Делалось по аналогии зенда.
Типа:
PHP код:
$array = array(
                
"page"=>1,
                
"name"=>"test",
                
"dop"=>array(
                    
"text"=>"bla-bla-bla"
                        
)
                );
                
//Как с массивом:

echo $array['page'];
echo 
$array['dop']['text'];

//Как с объектом:

echo $array->page;
echo 
$array->dop->text
НО ТОЛЬКО НА ЧТЕНИЕ!

Видите разницу?

PS: по поводу
PHP код:
PageCache::getInstance()->save("Session"
Хотел так тоже зделать. гетистанс ведь вызывается статически, а насколько я помню статика вызывается без создания объекта. Вопрос: как тогда вызывается save? в такому случаии гетистанс ведь должен вернуть объект. Или я чтото недоганяю.

Последний раз редактировалось dem66; 16.03.2012 в 17:49.
dem66 вне форума Ответить с цитированием
Старый 16.03.2012, 18:13   #15
Cronos20
Форумчанин
 
Регистрация: 08.07.2010
Сообщений: 679
По умолчанию

Обычный Singleton , создает один раз при первом обращении объект самого себя и постоянно возвращает именно его. Классический пример - работа с базой ... один раз создали коннект и все другие объекты при обращении используют только одну единственную копию и соединение
Cronos20 вне форума Ответить с цитированием
Старый 16.03.2012, 20:28   #16
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
По умолчанию

спасибо, я уже вспомнил
dem66 вне форума Ответить с цитированием
Старый 16.03.2012, 20:52   #17
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
По умолчанию

Подскажите а в орм кохана используется фабрика или синглтон. Вроде фабрика верно?

Сейчас вот переделываю ORM, незнаю как делать дальше. Дело в том что у меня орм построена по аналогии коханой. Тоесть используются гетеры и сетеры. И теперь возникая проблема в том что они срабатываю.

Например:
PHP код:
<?php
Class ORM{
        private 
$table;
        private 
$id;
        
        public static function 
factory($table$id=NULL){    
            static 
$db NULL;
            if(
$db==null$db = new ORM();
              
$db->table $table;
              
$db->id $id;

            return 
$db;
        }

    private 
$_handle null;
    
    function 
__construct(){
    
//unset($_SESSION['dbase']);

        
$dbase DF_Config::Ini(APPLICATION_PATH.'/configs/dbase.ini''dbase'1);
        
    
$driver "D".$dbase['driver'];
    include_once(
"Driver.php");
    
$this->driver = new $driver;

        
$this->_handle =& $this->driver->Connect($_SESSION['dbase']);
        
$this->driver->Query("SET NAMES utf8");    
        
$this->driver->Select_db($_SESSION['dbase']['database']);
    }

        public function 
handle(){
            return 
$this->_handle;
        }
}
А раньше были гетеры и сетеры. Тоесть можно было делать вот так:
PHP код:
$orm->text "записываем какойто там текст";
echo 
$orm->text;     //Читаем текст 
Вот код.
PHP код:
public function __get($key){
    return 
$this->find_once($key$this->id);
    }

    public function 
__set($key$var){
            
$this->construkt[$key] = $var;
    } 
А теперь при вызове ORM::factory('test', 1)->handle();
Предлагает далеко пойти. Срабатывает гетер. Как же тогда указывать ->Where, ->Limit и т.д и т.п???

PS: Вот нашел пример подключения драйверов. Что скажите по этому поводу?
PHP код:
<?php
class Example
{
    
// Параметризированный фабричный метод
    
public static function factory($type)
    {
        if (include_once 
'Drivers/' $type '.php') {
            
$classname 'Driver_' $type;
            return new 
$classname;
        } else {
            throw new 
Exception('Драйвер не найден');
        }
    }
}
?>
А выше в коде видно как драйвера подключаются у меня

Последний раз редактировалось dem66; 16.03.2012 в 21:14.
dem66 вне форума Ответить с цитированием
Старый 16.03.2012, 22:50   #18
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
По умолчанию

Вот наконец переписал клас ORM. Теперь с синглтоном, уже покрасивее выглядит. Вот только пока не тестировал по производительности.

Также прилагается драйвер.

Пример использования:

PHP код:
$where = array(array("AND","razdel.id","=",1),array("AND","content.razdel","=","razdel.id"));
            
$orm ORM::factory('test')->Select("razdel.title, content.body")->Where($where)->crossjoin("razdel,content")->find_all(); 
Получем в переменной $orm содержимое таблиц razdel и content. Точнее строки тайтл и боди, записи с id .

PHP код:
$orm ORM::factory('test')->find_all(); 
Получаем все записи из таблицы test.

PHP код:
$orm ORM::factory('test',1)->title
Получаем тайтл записи с id 1.

PHP код:
$orm ORM::factory('test');
$orm->title "Hello Word";
$orm->text "Привет всем";
$orm->flush(); 
Записываем в таблицу новую запись.

PHP код:
$orm ORM::factory('test')->return_id(); 
Получаем ID последнего инсерта

PHP код:
$orm ORM::factory('test',1);
$orm->title "Godby Word";
$orm->text "Всем пока";
$orm->Update(); 
Обновляем запись.

Также предусмотрен вариант написания запроса вручную.
PHP код:
$orm ORM::factory();
            
$orm->prepare("SELECT * FROM `test` WHERE `id`>100");
$result $orm->getResult(); 
Получаем записи из таблицы.

PHP код:
$orm ORM::factory();
            
$orm->prepare("DELETE FROM `test`");
$orm->execute(); 
Удаляем все к чертям собачим.

Пока буду мерекать над спариванием namespace и autoload
Вложения
Тип файла: txt orm.php.txt (10.1 Кб, 66 просмотров)
Тип файла: txt Driver.php.txt (1.6 Кб, 59 просмотров)

Последний раз редактировалось dem66; 16.03.2012 в 23:05.
dem66 вне форума Ответить с цитированием
Старый 16.03.2012, 23:05   #19
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
$where = array(array("AND","razdel.id","=",1),array("AND","content.razdel","=","razdel.id"));
Это всё зачем..?
Без этого мусора - всё делается красиво, одним простым массивом:
PHP код:
$where = array(
    
'razdel.id' => 1,
    
'content.razdel' => 'razdel.id'
); 
Andkorol вне форума Ответить с цитированием
Старый 16.03.2012, 23:10   #20
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
По умолчанию

а как его заставить разлечать AND/IN/ONE/LIKE ???

Просто делалось по примеру доктрины. Немного не так но всеже.

Вы бы подсказали как строить условие.
Ну там есть метож Where, реализация там никакая

Последний раз редактировалось dem66; 16.03.2012 в 23:30.
dem66 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Spring MVC Exact Java для Web (EE, Servlet, JSP, Tomcat, Spring MVC) 0 21.10.2011 14:38
Thread и MVC OnlyFart ASP.NET 0 06.05.2011 11:12
MVC AgentSmit PHP 2 11.01.2011 14:51
необходимость mvc mrgrudge PHP 2 13.12.2010 12:41
Кликер MVC++ jestyan Помощь студентам 0 10.12.2010 14:10