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 :: Версия для печати :: Подключение классов
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Подключение классов

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

1. radlif - 29 Февраля, 2012 - 04:04:02 - перейти к сообщению
Всем доброе время суток)

Пишу крупную 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.
2. sKaa - 29 Февраля, 2012 - 06:06:13 - перейти к сообщению
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.

А ну тогда извиняй
3. radlif - 29 Февраля, 2012 - 08:12:04 - перейти к сообщению
Напишу попроще у меня cms по принципу mvc.
есть папка систем в ней реализованы все возможные классы которые мне могут понадобится.
Так же есть папка юзер в которой содержатся папки модель и вывод.
В модели создаются php файлы которые наследуют класс парсер тот в свою очередь наследует класс логардер.
На одном из форумов по php как то видел реализацию кода таким образом
что класс присоединяется только когда его запрашивают.
Пример

И в описание данного кода было написано что пока нет запроса данный класс не где не существует и подключается только когда его запрашивают.
При этом сам код всего строчек 20 занимал.
Тогда просто как бы не задумывался что буду ОПП заниматся, а вот сейчас надо и не могу найти. Уже все посковики перевернул.
4. Okula - 29 Февраля, 2012 - 08:56:42 - перейти к сообщению
Тебе же написали:
spl_autoload_register()
или просто __autoload()
5. digi - 29 Февраля, 2012 - 12:08:59 - перейти к сообщению
очень понравился КлассЛоадер от сф2 http://symfony[dot]com/doc/current/c[dot][dot][dot]lass_loader[dot]html Улыбка также радует, что он может кешировать пути в АРС Улыбка
6. radlif - 01 Марта, 2012 - 12:04:55 - перейти к сообщению
Ну вот так как ответов нет сделал сам Улыбка
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.  


Теперь жду ваших коментов Улыбка
Какие могут быть проблемы и в чём я не прав Радость
7. Tonik992 - 01 Марта, 2012 - 20:51:30 - перейти к сообщению
radlif пишет:
Ну вот так как ответов нет сделал сам Улыбка
Теперь жду ваших коментов Улыбка
Какие могут быть проблемы и в чём я не прав Радость

Я думаю более разумнее будет вынести метод loadDB класса loader как простую функцию, либо сделать метод статическим. Улыбка Предпочтительней первый вариант конечно
+ надо сделать вызов trigger_error, либо отлавливать исключение, т.к. если класс не найден, дальнейшее выполнение программы нежелательно.. В твоем случае ты просто проверяешь, существует ли файл с классом. И если существует - возвращаешь экземпляр, а если нет - ничего не возвращаешь, но все равно у тебя будет попытка вызова метода addS
8. DeepVarvar - 01 Марта, 2012 - 21:08:30 - перейти к сообщению
А я добавлю:
1) Подключать и после отработки тут же уничтожать классы - вобще "не айс"...
2) Сколько раз вы будете к диску обращаться?
3) А если нужно будет "родить" сотенку моделек для списка чего либо?
4) А где кеширование результата работы класса/метода, зачем же его повторно вызывать?
5) Автолоадеру нужно заранее передать окружение, в котором он будет искать различные классы: плагины, вьюхи, контроллеры...
6) Автолоадером и собственно единым хранилищем всех инициализированных классов может стать "фабрика".
7) откажитесь передавать что-то куда-то явно по ссылке (тот же ваш return) - будет куча следов с рекурсией ссылок, и если вы решите все-же освободить память, то не сможете удалить объект, т.к. на него где-то остались ссылки. С этим какраз отлично справляется "фабрика".
9. radlif - 05 Марта, 2012 - 14:18:09 - перейти к сообщению
А как вам такая реализация?
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 у меня в каждом классе есть функция деструкт, пока проблем по уничтожению ненужных классов не наблюдал
10. sanyoksanya - 08 Августа, 2014 - 21:14:33 - перейти к сообщению
А ты не думал над тем, если в разных папках (sql и mod в данном случае) будет одинаковый по названию файл класса, что будет тогда, и какой из них программа выберет первым, это уже вопрос. Ну ладно две папки, а если в нескольких папках будет одинаковый по названию файл класса?
11. caballero - 09 Августа, 2014 - 02:35:41 - перейти к сообщению
Вася, зачем подымать тему двухлетней давности только чтобы чушь написать?
потрудись погуглить PSR-0
12. sanyoksanya - 09 Августа, 2014 - 10:25:23 - перейти к сообщению
Ваня, а я не тебе писал, я пишу для тех, кто попадет в интернете на эту тему так, как я, и просмотрит всю переписку. Так что не советуй когда тебя не просят.
13. radlif - 09 Августа, 2014 - 10:39:13 - перейти к сообщению
Во какую древнюю тему подняли))
Вообще то я ко всем классам всегда делал префикс,
к примеру:
BDconekt, SUSpars и тд....
Ща же это всё абсолютно неактуально да и на самописной смс не заработаешь так как нэт бесплатными под завязку забит...
14. tato - 11 Августа, 2014 - 01:06:39 - перейти к сообщению


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

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

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

 

Powered by ExBB FM 1.0 RC1