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

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

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

Смысл 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"
3. sKaa - 02 Февраля, 2012 - 13:52:24 - перейти к сообщению
Я как-то по другому сделал, но в целом суть та-же.
Функция ищет класс разбивая его 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.         );
4. Зверь - 02 Февраля, 2012 - 14:07:44 - перейти к сообщению
Спасибо, но оказалось проблема была в классе бд, а я всю вину свалил на autoload Улыбка
(Добавление)
sKaa пишет:
юзай spl_autoload_register ( их можно юзать несколько )

так его и использую
5. caballero - 02 Февраля, 2012 - 14:15:16 - перейти к сообщению
Функции автолоада вызываются в том порядке в каком зарегистрированы. Таким образом можно управлять загрузкой хотя на практике это вряд ли нужно
6. Okula - 02 Февраля, 2012 - 17:37:53 - перейти к сообщению
Беспокоится о том что __autoload() скоро удалят пока не стоит, так все хосты пока толкько на 5.3 версию переезжают, а функция эта работает замечательно на этой версии и тех что ранее Улыбка

 

Powered by ExBB FM 1.0 RC1