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 :: spl autoload classes и приоритеты

 PHP.SU

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


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

> Без описания
Зверь
Отправлено: 02 Февраля, 2012 - 13:14:26
Post Id



Частый гость


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


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




В общем сложилась такая проблема, что я создал функцию autoload и объявил ее в spl_autoload_register("autoload") вроде бы все ок, но как ей указать какие файлы приоритетнее и загружать первыми? У меня класс БД загружается самым последним и ничего поделать не могу, отсюда естественно ошибки с несуществующими методами и свойствами
 
 Top
EuGen Администратор
Отправлено: 02 Февраля, 2012 - 13:34:50
Post Id


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


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


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




Зверь пишет:
У меня класс БД загружается самым последним

Смысл autoload как раз в том, чтобы загружать "по требованию".
Например,
PHP:
скопировать код в буфер обмена
  1. function __autoload($className)
  2. {
  3.     return include_once(str_replace('_', '/', $className) . '.php');
  4. }


Будет раскрывать имя класса как относительный путь до содержащего его файла, и
PHP:
скопировать код в буфер обмена
  1. $rDb = new Db_Active_Record();
  2. //код, использующий Db_Active_Record

и
PHP:
скопировать код в буфер обмена
  1. //код, использующий Db_Active_Record
  2. $rDb = new Db_Active_Record();

- корректны, просто во втором случае класс подключится внутри "кода, использующего Db_Active_Record"


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
sKaa
Отправлено: 02 Февраля, 2012 - 13:52:24
Post Id



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


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


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

[+]


Я как-то по другому сделал, но в целом суть та-же.
Функция ищет класс разбивая его namespace.
Допустим класс
System \ Core \ Registry::set(..);
должен лежать в папке libs\System\Core\Registry.php
ну или какую там папку вмето libs я укажу при инициализации класса.
а сам __autoload помойму уже считается устаревшим и скоро его удалят. юзай spl_autoload_register ( их можно юзать несколько )
PHP:
скопировать код в буфер обмена
  1. namespace System \ Core {
  2.     final class Autoloader {
  3.        
  4.                 protected function __clone()                    { /* ... */ }
  5.                 protected function __wakeup()                   { /* ... */ }
  6.                 protected function __invoke()                   { /* ... */ }
  7.                 protected function __construct(){ }
  8.  
  9.         static public $classesLoaded = array();
  10.  
  11.         static public function Init($array = array(), $ext = '.php'){
  12.                 $temp = '';
  13.                 for($k=0;$k<count($array);$k++):
  14.                         $temp .= SITE_PATH . $array[$k] . DIRECTORY_SEPARATOR. PATH_SEPARATOR;
  15.                 endfor;
  16.                 set_include_path($temp);
  17.                 unset($temp);
  18.                 spl_autoload_extensions($ext);
  19.                 spl_autoload_register(
  20.                         function ($className) {
  21.                                 $className = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $className) . spl_autoload_extensions();
  22.                                 Autoloader::$classesLoaded[] = $className;
  23.                                 return include_once($className);
  24.                         }
  25.                 );
  26.  
  27.         }
  28.  
  29.     }
  30. }
  31.  
  32. System\Core\Autoloader::Init(
  33.                 /* ### Including path ### */
  34.                 array('libs','Controllers'),
  35.                 /* ### Include file extention ### */
  36.                 '.php'
  37.         );

(Отредактировано автором: 02 Февраля, 2012 - 13:57:33)

 
 Top
Зверь
Отправлено: 02 Февраля, 2012 - 14:07:44
Post Id



Частый гость


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


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




Спасибо, но оказалось проблема была в классе бд, а я всю вину свалил на autoload Улыбка
(Добавление)
sKaa пишет:
юзай spl_autoload_register ( их можно юзать несколько )

так его и использую
 
 Top
caballero
Отправлено: 02 Февраля, 2012 - 14:15:16
Post Id


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


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


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




Функции автолоада вызываются в том порядке в каком зарегистрированы. Таким образом можно управлять загрузкой хотя на практике это вряд ли нужно


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Okula
Отправлено: 02 Февраля, 2012 - 17:37:53
Post Id



Участник


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


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




Беспокоится о том что __autoload() скоро удалят пока не стоит, так все хосты пока толкько на 5.3 версию переезжают, а функция эта работает замечательно на этой версии и тех что ранее Улыбка
 
 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