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]   

> Описание: Подскажите как лучше
radlif
Отправлено: 29 Февраля, 2012 - 04:04:02
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2011  


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




Всем доброе время суток)

Пишу крупную cms и столкнулся с такой проблемой.
Как подключать классы только тогда когда они нужны?

То есть на данный момент есть класс загрузчик.
PHP:
скопировать код в буфер обмена
  1.  
  2. class loader
  3. {
  4. //функция обновления таблиц в базе
  5.     function update($tab = null, $arr = null, $id = null)
  6.     {
  7.         if ($tab!= null)
  8.         {
  9. //подключение к mysql
  10.             require_once SYS . 'sql/databaza.php';
  11. //загрузка класса update
  12.             require_once SYS . 'sql/update.php';
  13.             $temp = new update();
  14.             $rezult = $temp->up($tab, $arr, $id);
  15.             unset($temp);
  16.             return $rezult;
  17.         }
  18.     }
  19. }
  20.  

По такому принципу подключаются многие классы.
Но как я думаю возможно есть способ попроще так как у меня около 100
классов, и под каждый писать функцию наподобие update нерационально.
К тому-же как я понимаю все эти функции будут хранится в памяти.
Хелпните Улыбка

Упс забыл добавить, функция автологардер не подойдёт.
Так как cms должна стабильно работать на разных версиях php.

(Отредактировано автором: 29 Февраля, 2012 - 04:19:51)

 
 Top
sKaa
Отправлено: 29 Февраля, 2012 - 06:06:13
Post Id



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


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


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

[+]


radlif пишет:
Пишу крупную cms

Для этого нужны знания которых у тебя я не наблюдаю.
PHP:
скопировать код в буфер обмена
  1. function __autoload($classname){
  2.   return include_once($classname);
  3. }
  4. // или
  5. spl_autoload_register(function($classname){
  6.   return include_once($classname);
  7.   }
  8. );
  9.  

(Добавление)
radlif пишет:

Упс забыл добавить, функция автологардер не подойдёт.
Так как cms должна стабильно работать на разных версиях php.

А ну тогда извиняй

(Отредактировано автором: 29 Февраля, 2012 - 06:07:43)

 
 Top
radlif
Отправлено: 29 Февраля, 2012 - 08:12:04
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2011  


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




Напишу попроще у меня cms по принципу mvc.
есть папка систем в ней реализованы все возможные классы которые мне могут понадобится.
Так же есть папка юзер в которой содержатся папки модель и вывод.
В модели создаются php файлы которые наследуют класс парсер тот в свою очередь наследует класс логардер.
На одном из форумов по php как то видел реализацию кода таким образом
что класс присоединяется только когда его запрашивают.
Пример

И в описание данного кода было написано что пока нет запроса данный класс не где не существует и подключается только когда его запрашивают.
При этом сам код всего строчек 20 занимал.
Тогда просто как бы не задумывался что буду ОПП заниматся, а вот сейчас надо и не могу найти. Уже все посковики перевернул.
 
 Top
Okula
Отправлено: 29 Февраля, 2012 - 08:56:42
Post Id



Участник


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


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




Тебе же написали:
spl_autoload_register()
или просто __autoload()
 
 Top
digi
Отправлено: 29 Февраля, 2012 - 12:08:59
Post Id


Посетитель


Покинул форум
Сообщений всего: 406
Дата рег-ции: Янв. 2012  


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




очень понравился КлассЛоадер от сф2 http://symfony[dot]com/doc/current/c[dot][dot][dot]lass_loader[dot]html Улыбка также радует, что он может кешировать пути в АРС Улыбка
 
 Top
radlif
Отправлено: 01 Марта, 2012 - 12:04:55
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2011  


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




Ну вот так как ответов нет сделал сам Улыбка
PHP:
скопировать код в буфер обмена
  1.  
  2. class loader
  3. {
  4.     function loadDB($NameClass)
  5.     {
  6.         if (file_exists(SYS.'sql/'.$NameClass. '.php'))
  7.             {
  8.                 require_once SYS . 'sql/databaza.php';
  9.                 require_once SYS.'sql/'.$NameClass. '.php';
  10.                 return new $NameClass();
  11.             }
  12.  
  13.     }
  14. }
  15.  


Вызов осуществляется так:
PHP:
скопировать код в буфер обмена
  1.  
  2. class glav extends parser
  3. {
  4.     function index()
  5.     {
  6.         //масив данных
  7.         $d=array(0=>'logg',1=>'Djon',2=>'123456');
  8.         //подключение класса
  9.         $ss=$this->loadDB('addStr');
  10.         //передача данных в класс
  11.         $ss->addS($d);
  12.     }
  13. }
  14.  


Теперь жду ваших коментов Улыбка
Какие могут быть проблемы и в чём я не прав Радость

(Отредактировано автором: 01 Марта, 2012 - 12:29:00)

 
 Top
Tonik992
Отправлено: 01 Марта, 2012 - 20:51:30
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Июнь 2010  


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




radlif пишет:
Ну вот так как ответов нет сделал сам Улыбка
Теперь жду ваших коментов Улыбка
Какие могут быть проблемы и в чём я не прав Радость

Я думаю более разумнее будет вынести метод loadDB класса loader как простую функцию, либо сделать метод статическим. Улыбка Предпочтительней первый вариант конечно
+ надо сделать вызов trigger_error, либо отлавливать исключение, т.к. если класс не найден, дальнейшее выполнение программы нежелательно.. В твоем случае ты просто проверяешь, существует ли файл с классом. И если существует - возвращаешь экземпляр, а если нет - ничего не возвращаешь, но все равно у тебя будет попытка вызова метода addS

(Отредактировано автором: 01 Марта, 2012 - 20:55:57)

 
 Top
DeepVarvar Супермодератор
Отправлено: 01 Марта, 2012 - 21:08:30
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




А я добавлю:
1) Подключать и после отработки тут же уничтожать классы - вобще "не айс"...
2) Сколько раз вы будете к диску обращаться?
3) А если нужно будет "родить" сотенку моделек для списка чего либо?
4) А где кеширование результата работы класса/метода, зачем же его повторно вызывать?
5) Автолоадеру нужно заранее передать окружение, в котором он будет искать различные классы: плагины, вьюхи, контроллеры...
6) Автолоадером и собственно единым хранилищем всех инициализированных классов может стать "фабрика".
7) откажитесь передавать что-то куда-то явно по ссылке (тот же ваш return) - будет куча следов с рекурсией ссылок, и если вы решите все-же освободить память, то не сможете удалить объект, т.к. на него где-то остались ссылки. С этим какраз отлично справляется "фабрика".
 
 Top
radlif
Отправлено: 05 Марта, 2012 - 14:18:09
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2011  


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




А как вам такая реализация?
PHP:
скопировать код в буфер обмена
  1.  
  2. class loader
  3. {
  4.     function load($NC)
  5.     {
  6.         static $Rez = array();
  7.         $direkt[] = 'sql/';
  8.         $direkt[] = 'mod/';
  9.  
  10.         if (!array_key_exists($NC, $Rez))
  11.         {
  12.             for ($i = 0; $i < count($direkt); $i++)
  13.             {
  14.                 if (file_exists(SYS . $direkt[$i] . $NC . '.php'))
  15.                 {
  16.                     require_once SYS . $direkt[$i] . $NC . '.php';
  17.                     $Rez[$NC] = new $NC();
  18.                     return $Rez[$NC];
  19.                 } elseif ($i == count($direkt)-1)
  20.                 {
  21.                    //в дальнейшем вызов своей страницы error
  22.                     trigger_error("Данный класс несуществует!", E_USER_ERROR);
  23.                 }
  24.             }
  25.         }
  26.         else
  27.         {
  28.             return $Rez[$NC];
  29.         }
  30.     }
  31. }
  32.  


DeepVarvar у меня в каждом классе есть функция деструкт, пока проблем по уничтожению ненужных классов не наблюдал
 
 Top
sanyoksanya
Отправлено: 08 Августа, 2014 - 21:14:33
Post Id


Новичок


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


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




А ты не думал над тем, если в разных папках (sql и mod в данном случае) будет одинаковый по названию файл класса, что будет тогда, и какой из них программа выберет первым, это уже вопрос. Ну ладно две папки, а если в нескольких папках будет одинаковый по названию файл класса?
 
 Top
caballero
Отправлено: 09 Августа, 2014 - 02:35:41
Post Id


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


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


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




Вася, зачем подымать тему двухлетней давности только чтобы чушь написать?
потрудись погуглить PSR-0


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
sanyoksanya
Отправлено: 09 Августа, 2014 - 10:25:23
Post Id


Новичок


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


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




Ваня, а я не тебе писал, я пишу для тех, кто попадет в интернете на эту тему так, как я, и просмотрит всю переписку. Так что не советуй когда тебя не просят.
 
 Top
radlif
Отправлено: 09 Августа, 2014 - 10:39:13
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2011  


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




Во какую древнюю тему подняли))
Вообще то я ко всем классам всегда делал префикс,
к примеру:
BDconekt, SUSpars и тд....
Ща же это всё абсолютно неактуально да и на самописной смс не заработаешь так как нэт бесплатными под завязку забит...
 
 Top
tato
Отправлено: 11 Августа, 2014 - 01:06:39
Post Id



Посетитель


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


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






Это тема для топа!!!

Первое сообщение автора: "Пишу свою CMS"
спустя два года: "...на самописной смс не заработаешь так как нэт бесплатными под завязку забит"

Это прям должно быть на входе форума, мож подействует на кого (=


-----
просто ?: сложно
 
 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