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]   

> Описание: и автозагрузка классов
Slavenin
Отправлено: 04 Ноября, 2011 - 23:08:58
Post Id



Посетитель


Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010  
Откуда: Тверь


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




Всем доброго времени суток!
Совсем заблудился я в этом пространстве. У меня есть класс обеспечивающий автозагрузку классов в случае необходимости. Без использования пространств все работало великолепно, но так как проект грозит разрастись, то решил применить пространства имен и выделить все свои классы отдельно. Проблема возникает при автозагрузке класса. Почему-то при поиске нужного класса к нему добавляется пространство имен в качестве префикса. Например. При попытке подгрузить класс sample из пространства space в поиске класса фигурирует space\sample, и естественно ничего не находится.
код
вызывает ошибку The use statement with non-compound name...
PHP:
скопировать код в буфер обмена
  1. use \space;
  2. $iniObj = new sample;
это просто ни к чему не приводит
приводит к поиску space\sample вместо sample

так как же все-таки правильно заюзать свои классы из заданного пространства?

(Отредактировано автором: 04 Ноября, 2011 - 23:10:32)

 
 Top
OrmaJever Модератор
Отправлено: 04 Ноября, 2011 - 23:42:19
Post Id



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


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


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




Slavenin пишет:
Почему-то при поиске нужного класса к нему добавляется пространство имен в качестве префикса.

а как должно быть? Не понял
пространства имён пишутся через :: (двойное двоиточие).

и где код автолоад?


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Slavenin
Отправлено: 05 Ноября, 2011 - 09:39:51
Post Id



Посетитель


Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010  
Откуда: Тверь


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




запись через двойное двоеточие вызывает ошибку Parse error: syntax error, unexpected T_STRING, expecting T_VARIABLE or '$'

Цитата:
а как должно быть?

хотелось бы чтобы искались конкретно классы по их именам. Единственный выход который пока вижу это перед загрузкой проверять имя класса на наличие префикса

класс автозагрузчика:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. namespace xmlEngine
  3. {
  4.   class Autoloader
  5.   {
  6.     public function __construct(){}
  7.  
  8.     public static function autoload($file)
  9.     {
  10.       $path = $_SERVER['DOCUMENT_ROOT'] . '/classes';
  11.       $filepath = $_SERVER['DOCUMENT_ROOT'] . '/classes/' . $file . '.php';
  12.  
  13.       if (file_exists($filepath))
  14.       {
  15.         require_once($filepath);
  16.       }
  17.       else
  18.       {
  19.         Autoloader::recursive_autoload($file, $path);
  20.       }
  21.     }
  22.  
  23.     public static function recursive_autoload($file, $path)
  24.     {
  25.       if (FALSE !== ($handle = opendir($path)))
  26.       {
  27.         while (FAlSE !== ($dir = readdir($handle)))
  28.         {
  29.          
  30.           if (strpos($dir, '.') === FALSE)
  31.           {
  32.             $path2 = $path .'/' . $dir;
  33.             $filepath = $path2 . '/' . $file . '.php';
  34.  
  35.             if (file_exists($filepath))
  36.             {
  37.               require_once($filepath);
  38.               break;
  39.             }
  40.             Autoloader::recursive_autoload($file, $path2);
  41.           }
  42.         }
  43.         closedir($handle);
  44.       }
  45.     }
  46.   }
  47.   \spl_autoload_register('xmlEngine\Autoloader::autoload');
  48. }
  49.  
  50. ?>
 
 Top
OrmaJever Модератор
Отправлено: 05 Ноября, 2011 - 13:50:02
Post Id



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


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


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




Slavenin пишет:
хотелось бы чтобы искались конкретно классы по их именам. Единственный выход который пока вижу это перед загрузкой проверять имя класса на наличие префикса

изначально расчитано так. Например у нас есть пространство space и в нём 3 класа A, B, C, и есть пространство other, и так же 3 класса A, B, C. Они лежат в такой структуре
CODE (htmlphp):
скопировать код в буфер обмена
  1. ./space/
  2.    A.php
  3.    B.php
  4.    C.php
  5. ./other/
  6.    A.php
  7.    B.php
  8.    C.php

для того чтобы разработчик мог вызывать нужные классы из нужных пространств то в автолоад передаётся и пространство тоже. Ну и как вы уже выяснили нужно проверять на наличие пространсва в автолоаде.
Slavenin пишет:
\spl_autoload_register('xmlEngine\Autoloader::autoload');

хмм... а так разве можно? Насколько я знаю нужно писать так
CODE (htmlphp):
скопировать код в буфер обмена
  1. xmlEngine::Autoloader::autoload


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
caballero
Отправлено: 05 Ноября, 2011 - 14:02:55
Post Id


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


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


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




Цитата:
пространства имён пишутся через :: (двойное двоиточие).


не пишутся
обратный слеш

Slavenin
самое простое - расположить файлы в подкаталогах так как они в namespace вложены (по типу явовских пакетов)

тогда автолоад организовать намного проще

(Отредактировано автором: 05 Ноября, 2011 - 14:06:01)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Slavenin
Отправлено: 05 Ноября, 2011 - 14:14:18
Post Id



Посетитель


Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010  
Откуда: Тверь


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




Цитата:
хмм... а так разве можно? Насколько я знаю нужно писать так

можно, а вот приведенный вами способ почему-то вызывает ошибку.

в принципе решил проблему добавлением в функцию автолоада проверки наличия пространства. Но, наверн, сейчас действительно расположу все в подпапках. Не зря видать во всех мануалах пространства ассоциируются с файловой системой Улыбка Благодарю всех за помощь! Улыбка
 
 Top
OrmaJever Модератор
Отправлено: 05 Ноября, 2011 - 14:15:07
Post Id



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


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


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




caballero пишет:
не пишутся
обратный слеш

Slavenin пишет:
можно, а вот приведенный вами способ почему-то вызывает ошибку.

может я не правельно вычитал? Растерялся
http://blog[dot]web2[dot]com[dot]ua/2009/07/[dot][dot][dot]ovogo-v-php-5-3/


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Slavenin
Отправлено: 05 Ноября, 2011 - 14:25:28
Post Id



Посетитель


Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010  
Откуда: Тверь


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




OrmaJever, я тоже не могу понять почему способ через разрешение пространства имен вызывает ошибку причем он описан и в мануалах, но тем не менее не работает. Как вариант могу предположить, что в последних версиях языка что-то поменяли.
интересное обсуждение идет в комментах на хабре http://habrahabr.ru/blogs/php/72097/

(Отредактировано автором: 05 Ноября, 2011 - 14:33:13)

 
 Top
caballero
Отправлено: 05 Ноября, 2011 - 14:35:03
Post Id


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


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


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






а более древней ссылки не нашли ?
вначале предполагалось :: потом заменили на \
возможно чтобы не было путаницы со статическими вызовами

Цитата:
Не зря видать во всех мануалах пространства ассоциируются с файловой системой

типа того. перебиваешь слэш реплэйсом в обратную сторону и получаешь путь к файу

я в ссвоем фреймворке так сделал

типа

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

(Отредактировано автором: 05 Ноября, 2011 - 14:41:24)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Slavenin
Отправлено: 05 Ноября, 2011 - 14:50:52
Post Id



Посетитель


Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010  
Откуда: Тверь


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




Цитата:
перебиваешь слэш реплэйсом в обратную сторону и получаешь путь к файлу

да нет, ничего перебивать не надо, приведенный выше класс прекрасно работает, достаточно просто положить классы в папки с соответствующими нэймспейсам именами
 
 Top
caballero
Отправлено: 05 Ноября, 2011 - 15:01:26
Post Id


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


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


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




Цитата:
да нет, ничего перебивать не надо, приведенный выше класс прекрасно работает, достаточно просто положить классы в папки с соответствующими нэймспейсам именами


вообще то если это будет на хостинге это значит на юниксе а там лучше пути все таки на прямые слэши перебить - это винда все хавает

поэтому и пути привожу к нижнему регистру чтобы имена файлов писать одинаково в нижнем и не иметь проблем в юнихе


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 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