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. Slavenin - 25 Мая, 2011 - 19:18:18 - перейти к сообщению
Всем доброго времени суток. возникла следующая проблема. Есть дирректория с файлами классов, есть директории других файлов. есть основной класс расположенный в папке с классами некоторые поля у него инициализируются объектами других классов. при подключении его из разных директорий возникает проблема инициализации полей, которые являются объектами других классов, так как php их попросту не находит.

попытался написать функцию автоподгрузки классов:

PHP:
скопировать код в буфер обмена
  1. function LoadClass($ClassName)
  2.   {
  3.  
  4.       $dir = "http://localhost/classes/";
  5.       if(file_exists($dir .$ClassName))
  6.       {
  7.          return require_once($dir .$ClassName);
  8.       }
  9.       return 'не работает';
  10.    }


функция всегда возвращает не работает. в чем проблема понять не могу. если просто перейти по формирующемуся адресу, то попадаю в нужный файл. а функция file_exists всегда возвращает false

даже если исключить функцию file_exists файл всеравно не подключается
2. Champion - 25 Мая, 2011 - 19:27:50 - перейти к сообщению
не надо инклюдить код по http. Вы работаете с файловой системой
3. Slavenin - 25 Мая, 2011 - 19:29:40 - перейти к сообщению
да я б и не стал так делать, но с локальными адресами возникают проблемы которые я не могу обойти. в частности как я говорил выше с подключением файлов с классами при создании объекта в разных по вложенности директориях
4. DeepVarvar - 25 Мая, 2011 - 19:33:58 - перейти к сообщению
Slavenin пишет:
возникают проблемы которые я не могу обойти
Какие?
5. Slavenin - 25 Мая, 2011 - 19:39:12 - перейти к сообщению
Цитата:
есть основной класс расположенный в папке с классами некоторые поля у него инициализируются объектами других классов. при подключении его из разных директорий возникает проблема инициализации полей, которые являются объектами других классов, так как php их попросту не находит


приведу пример

есть классы
PHP:
скопировать код в буфер обмена
  1.  class a
  2. {
  3.   var $a;
  4.  
  5.  function LoadClass($ClassName)
  6.   {
  7.      $dir = "cl/" .$ClassName;
  8.      require_once($dir);
  9.    }
  10. }
  11.  
  12.  class b
  13. {
  14.   var $b;
  15.  functin b()
  16.  {
  17.   $this->a = new a();
  18.  }
  19. }

оба файла лежат в одной папке cl , расположенной в корневой дирректории.

теперь если подключить класс в корневой директории с помощью функции загрузки LoadClass, то все пройдет хорошо, но если эту функцию запустить из класса a заинклюденного в одной из папок директории, то путь подгрузки должен измениться на


в этом собственно и заключается проблема
6. EuGen - 25 Мая, 2011 - 20:17:45 - перейти к сообщению
Посмотрите здесь ветке уроков урок №19.
Там есть пример функции __autoload
Организуйте свои классы подобным образом и проблема будет решена раз и навсегда.
7. komprenda - 25 Мая, 2011 - 21:04:40 - перейти к сообщению
Slavenin пишет:
Всем доброго времени суток. возникла следующая проблема. Есть дирректория с файлами классов, есть директории других файлов. есть основной класс расположенный в папке с классами некоторые поля у него инициализируются объектами других классов. при подключении его из разных директорий возникает проблема инициализации полей, которые являются объектами других классов, так как php их попросту не находит.

попытался написать функцию автоподгрузки классов:

PHP:
скопировать код в буфер обмена
  1. function LoadClass($ClassName)
  2.   {
  3.  
  4.       $dir = "http://localhost/classes/";
  5.       if(file_exists($dir .$ClassName))
  6.       {
  7.          return require_once($dir .$ClassName);
  8.       }
  9.       return 'не работает';
  10.    }


функция всегда возвращает не работает. в чем проблема понять не могу. если просто перейти по формирующемуся адресу, то попадаю в нужный файл. а функция file_exists всегда возвращает false

даже если исключить функцию file_exists файл всеравно не подключается


PHP:
скопировать код в буфер обмена
  1. function __autoload($class) {
  2.     $filename = "classes/{$class}.php";
  3.     if (file_exists($filename)) {
  4.         require_once($filename);
  5.     }
  6. }
8. Champion - 25 Мая, 2011 - 21:13:49 - перейти к сообщению
Проблема с относительными путями что ли? Есть еще абсолютные пути - от /.
Или относительные от одного места - от DOCUMENT_ROOT - от них и отплясывайте
9. Stierus - 26 Мая, 2011 - 10:44:27 - перейти к сообщению
ну так вы подгружайте по путям относительно файла, в котором лежит файл подгрузчика (он никогда не меняется) dirname(__FILE__)
10. Slavenin - 27 Мая, 2011 - 17:44:39 - перейти к сообщению
проблема решилась прочтением статьи http://www.phpfaq[dot]ru/paths и использованием $_SERVER['DOCUMENT_ROOT'], благодарю всех, кто откликнулся Улыбка

 

Powered by ExBB FM 1.0 RC1