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 :: Версия для печати :: Использование магической функции __autoload()
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Использование магической функции __autoload()

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

1. romantik2011 - 29 Июля, 2011 - 17:41:52 - перейти к сообщению
Прочитал здесь: http://phpclub[dot]ru/faq/PHP5/Autoload
что в PHP5 перед тем как создать объект несуществующего класса, идёт попытка вызова __autoload(), который должен попытаться подключить такой класс, которого на самом деле нету.

Вот в одной директории, у меня лежит 3 файла:
index.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. function __autoload($name){
  4. include  $name.".class.php";
  5. echo "Ищем класс $name";
  6. }
  7.  
  8. $ob1 = new A();
  9. $ob1->son();
  10. $ob2 = new B();
  11. $ob2->fanta();
  12.  
  13. ?>
  14.  

A.class.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. class A{
  5.   public function son(){
  6.       echo "<br />Вызвана функция <u>Сон</u>, класса <u>А</u>";
  7.   }
  8. }
  9.  
  10. ?>
  11.  


B.class.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. class A{
  5.   public function fanta(){
  6.       echo "<br />Вызвана функция <u>Fanta</u>, класса <u>B</u>";
  7.   }
  8. }
  9.  
  10. ?>
  11.  


Класс А находит, а класс В нет, как быть?
2. Champion - 29 Июля, 2011 - 17:47:22 - перейти к сообщению
romantik2011 пишет:
B.class.php


<?PHP

class A{
3. romantik2011 - 29 Июля, 2011 - 17:48:36 - перейти к сообщению
Точно, спасибо. Скажите, вот всегда надо писать? ".class.php";
я имею ввиду ключевое слово class, а файлы обязательно называть?
<Название>+<.class>+<.php>?

Вот так не хочет искать include $name."*.php" и так тоже не ищет include $name."A.class.php";
и ещё момент, зачем конкатенировать, вот с этим $name ?
4. Мелкий - 29 Июля, 2011 - 17:55:01 - перейти к сообщению
romantik2011 пишет:
Скажите, вот всегда надо писать? ".class.php";

Функцию __autoload вы реализовываете самостоятельно, получаете имя запрошенного класса и можете собирать любой путь и имя файла.
5. romantik2011 - 29 Июля, 2011 - 18:02:20 - перейти к сообщению
Как не менял путь, по другмоу не ищет, ищет только так include $name.".class.php";
и ещё момент, зачем конкатенировать, вот с этим $name ?
(Добавление)
Всё понял ,спасибо. Скажите, а если например у меня 500 классов, все называются так: название.class.php
не будет ли это вредно столько подключить? Может на что-то влияет или лишняя память расходуется?
6. LIME - 29 Июля, 2011 - 18:21:15 - перейти к сообщению
romantik2011 в автолоад передается имя класса а вы с ним делаете в ф-ции что хотите хоть подключайте хоть выводите сообщение какое-нибудь
romantik2011 пишет:
и ещё момент, зачем конкатенировать, вот с этим $name ?
потому-что у вас так файл называется имя_класса.class.php
назовите файл по другому и формировать будете иначе
(Добавление)
romantik2011 пишет:
Скажите, а если например у меня 500 классов, все называются так: название.class.php
не будет ли это вредно столько подключить?
подключаться будут только те, к которым есть попытка доступа
да и ситуация слишком надумана
7. romantik2011 - 29 Июля, 2011 - 18:27:38 - перейти к сообщению
Значит если объект создам только тогда класс подключится из множества классов, а если объект не создам, тогда и файл не подключится через __autoload()?
8. EuGen - 29 Июля, 2011 - 21:14:18 - перейти к сообщению
Да.
В этом состоит еще и ускорение. __autoload подключает классы "по требованию". Можете в ветке уроков (урок номер 19) - посмотреть пример реализации и организации структуры классов.
9. LIME - 29 Июля, 2011 - 21:33:45 - перейти к сообщению
romantik2011 в общем ситуация такая
если создается не описанный объект вызывается автолоад
в ней можете делать что хотите но естественно было бы подключить описание класса))
и снова делается попытка создать объект
и если 2ой раз не находит его тогда выдает ошибку

 

Powered by ExBB FM 1.0 RC1