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 :: Использование магической функции __autoload()

 PHP.SU

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


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

> Без описания
romantik2011
Отправлено: 29 Июля, 2011 - 17:41:52
Post Id


Новичок


Покинул форум
Сообщений всего: 62
Дата рег-ции: Июль 2011  


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




Прочитал здесь: 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.  


Класс А находит, а класс В нет, как быть?
 
 Top
Champion Супермодератор
Отправлено: 29 Июля, 2011 - 17:47:22
Post Id



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


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


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




romantik2011 пишет:
B.class.php


<?PHP

class A{
 
 Top
romantik2011
Отправлено: 29 Июля, 2011 - 17:48:36
Post Id


Новичок


Покинул форум
Сообщений всего: 62
Дата рег-ции: Июль 2011  


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




Точно, спасибо. Скажите, вот всегда надо писать? ".class.php";
я имею ввиду ключевое слово class, а файлы обязательно называть?
<Название>+<.class>+<.php>?

Вот так не хочет искать include $name."*.php" и так тоже не ищет include $name."A.class.php";
и ещё момент, зачем конкатенировать, вот с этим $name ?

(Отредактировано автором: 29 Июля, 2011 - 17:52:13)

 
 Top
Мелкий Супермодератор
Отправлено: 29 Июля, 2011 - 17:55:01
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




romantik2011 пишет:
Скажите, вот всегда надо писать? ".class.php";

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


-----
PostgreSQL DBA
 
 Top
romantik2011
Отправлено: 29 Июля, 2011 - 18:02:20
Post Id


Новичок


Покинул форум
Сообщений всего: 62
Дата рег-ции: Июль 2011  


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




Как не менял путь, по другмоу не ищет, ищет только так include $name.".class.php";
и ещё момент, зачем конкатенировать, вот с этим $name ?
(Добавление)
Всё понял ,спасибо. Скажите, а если например у меня 500 классов, все называются так: название.class.php
не будет ли это вредно столько подключить? Может на что-то влияет или лишняя память расходуется?
 
 Top
LIME
Отправлено: 29 Июля, 2011 - 18:21:15
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




romantik2011 в автолоад передается имя класса а вы с ним делаете в ф-ции что хотите хоть подключайте хоть выводите сообщение какое-нибудь
romantik2011 пишет:
и ещё момент, зачем конкатенировать, вот с этим $name ?
потому-что у вас так файл называется имя_класса.class.php
назовите файл по другому и формировать будете иначе
(Добавление)
romantik2011 пишет:
Скажите, а если например у меня 500 классов, все называются так: название.class.php
не будет ли это вредно столько подключить?
подключаться будут только те, к которым есть попытка доступа
да и ситуация слишком надумана
 
 Top
romantik2011
Отправлено: 29 Июля, 2011 - 18:27:38
Post Id


Новичок


Покинул форум
Сообщений всего: 62
Дата рег-ции: Июль 2011  


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




Значит если объект создам только тогда класс подключится из множества классов, а если объект не создам, тогда и файл не подключится через __autoload()?
 
 Top
EuGen Администратор
Отправлено: 29 Июля, 2011 - 21:14:18
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Да.
В этом состоит еще и ускорение. __autoload подключает классы "по требованию". Можете в ветке уроков (урок номер 19) - посмотреть пример реализации и организации структуры классов.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
LIME
Отправлено: 29 Июля, 2011 - 21:33:45
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




romantik2011 в общем ситуация такая
если создается не описанный объект вызывается автолоад
в ней можете делать что хотите но естественно было бы подключить описание класса))
и снова делается попытка создать объект
и если 2ой раз не находит его тогда выдает ошибку
 
 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