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_register

 PHP.SU

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


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

> Без описания
armancho7777777 Супермодератор
Отправлено: 25 Августа, 2012 - 17:24:59
Post Id



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


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


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




Всем привет !
Почему возвращает только первый метод-загрузчик ?

PHP:
скопировать код в буфер обмена
  1.  
  2. spl_autoload_register(array('Loader', 'autoload'));
  3. spl_autoload_register(array('Loader', 'autoload2'));
  4.  
  5. class Loader {
  6.  
  7.         public static function autoload($class_name)
  8.         {
  9.                        // ....
  10.         }
  11.        
  12.         public static function autoload2($class_name)
  13.         {
  14.                       // .........
  15.         }
  16.  
  17. }
  18.  

(Отредактировано автором: 25 Августа, 2012 - 18:09:36)

 
 Top
caballero
Отправлено: 25 Августа, 2012 - 17:36:03
Post Id


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


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


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




что значит "возвращает"? Они должны вызыватся по мере объявления.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
armancho7777777 Супермодератор
Отправлено: 25 Августа, 2012 - 17:39:20
Post Id



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


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


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




caballero пишет:
что значит "возвращает"?

Ну, в смысле вызывается )
В спешке не так выразился и к тому же тему создал )
У меня в методах стояло это:
PHP:
скопировать код в буфер обмена
  1.  
  2. if(file_exists($class_file))
  3. include $class_file;
  4. else
  5. die('Файл <b>'.$class_file.'</b> функция <b>'.__FUNCTION__.'</b> не нашла!');
  6.  

... и потому, работа загрузчика обрывалась на первом же file_exists($class_file) == false.
Разобрался.

А почему бы ни сделать так?
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. function autoload($class_name)
  4. {
  5.         // Все возможные пути к файлам классов
  6.         $paths = array(
  7.            'sistem/classes',
  8.            'sistem/interfaces'
  9.         );
  10.        
  11.         $class_file = false;
  12.        
  13.         foreach($paths as $path)
  14.         {
  15.                 if(file_exists($path.'/'.$class_name.'.php'))
  16.                 {
  17.                         $class_file = $path.'/'.$class_name.'.php';
  18.                         break;
  19.                 }
  20.         }
  21.        
  22.         if($class_file !== false)
  23.         include $class_file;
  24.         else
  25.         die('Файл для класса '.$class_name.' autoload не нашёл!');
  26. }
  27.  

(Отредактировано автором: 25 Августа, 2012 - 17:47:48)

 
 Top
caballero
Отправлено: 25 Августа, 2012 - 17:48:07
Post Id


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


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


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




а зачем в цикле перебирать - пропишите ассоциативный массив - ключ значение
в смысле имя класса - путь


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
armancho7777777 Супермодератор
Отправлено: 25 Августа, 2012 - 17:56:34
Post Id



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


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


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




Я думал об этом...
Просто так будет несколько путей всего (интераций не много),
а если array(имя класса -> путь), то придётся каждый раз при добавлении какого либо класса править этот файл, дописывая имя класса.

(Отредактировано автором: 25 Августа, 2012 - 17:57:01)

 
 Top
caballero
Отправлено: 25 Августа, 2012 - 18:01:11
Post Id


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


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


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




верно
вообще есть смысл строить классы с использованием namespace
тогда если иерархия namespace бкдет совпадать с расположением классов - можно и без массива обойтись


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
armancho7777777 Супермодератор
Отправлено: 25 Августа, 2012 - 18:08:53
Post Id



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


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


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




Ага.
Спасибо !)

armancho7777777 пишет:
если иерархия namespace будет совпадать с расположением классов

Вы имеете в виду типа такого ?
PHP:
скопировать код в буфер обмена
  1. class PathPath2Path3Class_name {}

Имена длинные получаются, использовать не удобно потом в коде )
Потому отказался от таких методов )
(Добавление)
Что-то не пойму...
Почему выдаётся ошибка include ?
Разве загрузчики не должны вызывать друг за другом по необходимости ?
PHP:
скопировать код в буфер обмена
  1.  
  2. spl_autoload_register(array('Loader', 'autoload_sistem_class'));
  3. spl_autoload_register(array('Loader', 'autoload_sistem_interface'));
  4.  
  5. class Loader {
  6.    
  7.         public static function autoload_sistem_class($class_name)
  8.         {      
  9.                 include 'sistem/classes/'.$class_name.'.php';
  10.         }
  11.        
  12.         public static function autoload_sistem_interface($class_name)
  13.         {      
  14.                 include 'sistem/interfaces/'.$class_name.'.php';
  15.         }
  16. }
  17.  


Конечно, если добавить if(file_exists($path.$class_name.'.php')) перед include,
то всё работает...

(Отредактировано автором: 25 Августа, 2012 - 18:15:41)

 
 Top
caballero
Отправлено: 25 Августа, 2012 - 20:05:57
Post Id


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


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


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




Цитата:
Разве загрузчики не должны вызывать друг за другом по необходимости

вызывабтся пока не загрузится нужны класс или не вывалится ошибка
Цитата:
Вы имеете в виду типа такого ?

нет
типа такого
\ZippyCMS\Core\Application

Цитата:
Имена длинные получаются, использовать не удобно потом в коде


почему же
use \ZippyCMS\Core\Application as App;

очень даже коротко


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
armancho7777777 Супермодератор
Отправлено: 25 Августа, 2012 - 21:43:14
Post Id



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


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


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




caballero пишет:
вызывабтся пока не загрузится нужны класс или не вывалится ошибка
Но он вываливает ошибку include в первом же загрузчике.
caballero пишет:
use \ZippyCMS\Core\Application as App;

caballero, можно прокомментировать ?
А лучше просто краткий пример )

(Отредактировано автором: 25 Августа, 2012 - 21:44:01)

 
 Top
digi
Отправлено: 25 Августа, 2012 - 21:46:21
Post Id


Посетитель


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


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




а еще можно заюзать готовый компонент по автозагрузке ;) в нём же заюзать АРС кеширование, тогда еще и ускорится всё приятненько так ;)
 
 Top
armancho7777777 Супермодератор
Отправлено: 25 Августа, 2012 - 21:52:06
Post Id



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


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


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




digi, можно ссылочку, где почитать про это всё ?)
(Добавление)
digi пишет:
АРС кеширование

Что такое АРС ?
 
 Top
caballero
Отправлено: 25 Августа, 2012 - 22:00:33
Post Id


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


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


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




Цитата:
caballero, можно прокомментировать ?
А лучше просто краткий пример )


примерно так

PHP:
скопировать код в буфер обмена
  1. namespace ZippyCMS\Core;
  2.  
  3. class Application extends \Zippy\WebApplication
  4. {
  5. ...
  6. }


загрузчик


PHP:
скопировать код в буфер обмена
  1. function autoload($className)
  2. {
  3. if (strpos($className, 'ZippyCMS/Core/') === 0)
  4. {
  5.     require_once(__DIR__ . "/" . strtolower(str_replace("ZippyCMS/", "", $className)) . ".php");
  6.         }
  7. }
  8. }


юзаем

можно полный путь
PHP:
скопировать код в буфер обмена
  1.         $app = new \ZippyCMS\Core\Application
  2.        
  3.         $app->Run


или

PHP:
скопировать код в буфер обмена
  1. use \ZippyCMS\Core\Application as App;
  2.  
  3. $app = new App()
  4.    $app->Run()


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



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


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


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




Спасибо caballero ещё раз !)
Всё предельно ясно ))
(Добавление)
caballero, а Zippy, - это Ваша разработка ?
 
 Top
caballero
Отправлено: 25 Августа, 2012 - 23:07:47
Post Id


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


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


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




Цитата:
caballero, а Zippy, - это Ваша разработка ?

Угу.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
digi
Отправлено: 26 Августа, 2012 - 07:44:52
Post Id


Посетитель


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


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




armancho7777777 пишет:
digi, можно ссылочку, где почитать про это всё ?)

http://symfony[dot]com/doc/master/co[dot][dot][dot]lass_loader[dot]html

или так

https://www.google.ru/search?q=apc+class+loader

(Отредактировано автором: 26 Августа, 2012 - 07:47:25)

 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB