Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Закрытая темаСоздание новой темыСоздание опроса

> Динамическое подключение классов, Как реализовать?
Ka4_0k  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Абориген
*****

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 201
Пользователь №: 17150
На форуме: 8 лет, 8 дней
Карма:




Вот сейчас задумался, а как это сделать? Приходило в голову что-то типа :
PHP
function core() {
        $classDir = opendir(dirname(__FILE__));
        while($classFile = readdir($classDir)) {
            if($classFile != '.' && $classFile != '..' && $classFile != 'core.php')
                $classes[] = $classFile;
        }
        closedir($classDir);
        foreach($classes as $currentClassFile) {
            include_once($currentClassFile);
            $currentClassName = substr($currentClassFile,0,(strlen($currentClassFile)-4));
            $this->_classes = new $currentClassName;
        }
}

Ну или $this->_classes заменить на массив. Ну вообщем задумка такая чтобы все классы, которые находятся в каталоге классов автоматически подключались при старте скрипта. При использовании вышенаписанного происходит перепонение буфера.... Может кто поделится идеей?smile.gif
Использую php 5.3 т.к. хост на него будет скоро переходить всё равно.
Дополнение: core - базовый класс, а core() - функция для выполнения при объявлении объекта.
Сильно не пинайте, ООП начал использовать очень недавно smile.gif .



Спустя 47 минут, 23 секунды (31.10.2009 - 16:19) glock18 написал(а):
Ka4_0k
ммм... к чему подключать сразу все классы?

пхп 5.3 прекрасная штука, но даже меньшие версии позволяют назначить свою функцию (метод класса или объекта) для автоматической загрузки классов. при этом загружаться они будут только по мере обращения к ним.

Спустя 17 минут, 23 секунды (31.10.2009 - 16:36) Ka4_0k написал(а):
Ну вообщем как я делал. В начале index.php
PHP
require_once("classes/core.php");
$main = new core; //и вот при этом в $main->_classes должен быть объект или массив.

Классы хотел подключить при объявлении объекта main, чтобы они автоматом вписались в элемент _classes.

Цитата
пхп 5.3 прекрасная штука, но даже меньшие версии позволяют назначить свою функцию (метод класса или объекта) для автоматической загрузки классов. при этом загружаться они будут только по мере обращения к ним.

Это как? require и include теперь для классов не нужны?

Спустя 52 минуты, 12 секунд (31.10.2009 - 17:28) WildeR написал(а):
Цитата (Ka4_0k @ 31.10.2009 - 13:36)
Это как? require и include теперь для классов не нужны?

function __autoload тебе нужна для автоматического подключения классов. В ней уже будешь делать инклуд нужного файла.

Спустя 2 минуты, 55 секунд (31.10.2009 - 17:31) Ka4_0k написал(а):
Цитата (WildeR @ 31.10.2009 - 14:28)
Цитата (Ka4_0k @ 31.10.2009 - 13:36)
Это как? require и include теперь для классов не нужны?

function __autoload тебе нужна для автоматического подключения классов. В ней уже будешь делать инклуд нужного файла.

Нет, немного не то smile.gif ,мне нужно чтобы классы автоматом подхватились из папки. Тоесть динамическая подгрузка.

Спустя 7 минут, 45 секунд (31.10.2009 - 17:39) WildeR написал(а):
Цитата (Ka4_0k @ 31.10.2009 - 14:31)
Цитата (WildeR @ 31.10.2009 - 14:28)
Цитата (Ka4_0k @ 31.10.2009 - 13:36)
Это как? require и include теперь для классов не нужны?

function __autoload тебе нужна для автоматического подключения классов. В ней уже будешь делать инклуд нужного файла.

Нет, немного не то smile.gif ,мне нужно чтобы классы автоматом подхватились из папки. Тоесть динамическая подгрузка.

Что ты понимаешь под динамической подгрузкой?smile.gif
function __autoload как раз выполняется, когда в коде встречается необъявленный класс.
Можно вот так написать эту функцию например:

PHP
function __autoload($class_name) {
        
$filename strtolower($class_name) . '.php';
        
$file site_path DIRSEP .'www'DIRSEP 'blocks' DIRSEP .'classes' DIRSEP $filename;
        if (
file_exists($file) == false) {
                return 
false;
        }
        include (
$file);
}

Спустя 2 минуты, 26 секунд (31.10.2009 - 17:41) Ka4_0k написал(а):
Так вот мне какраз и надо чтобы не использовать подобные вещи:) Я же выше написал
Цитата
Классы хотел подключить при объявлении объекта main, чтобы они автоматом вписались в элемент _classes.

Тоесть не требуется никаких вызовов. Подключаются все классы которые находятся в каталоге классов и при этом все заносятся либо в подобъект объекта main или в массив в объекте main=).
Стоп. Вот это без её вызова?
Цитата
function __autoload как раз выполняется, когда в коде встречается необъявленный класс.

Спустя 7 минут, 52 секунды (31.10.2009 - 17:49) WildeR написал(а):
Цитата (Ka4_0k @ 31.10.2009 - 14:41)
Стоп. Вот это без её вызова?

Объявляешь эту функцию в скрипте и классы при обращении к ним будут загружаться автоматически без "ручного" вызова самой этой функции.
То есть при обнаружении необъявленного класса php сам вызовет функцию __autoload.

Спустя 6 минут, 46 секунд (31.10.2009 - 17:56) Ka4_0k написал(а):
Спасибо большое! =) А если она будет находится сам в классе core ? Тоесть класс core я подключу вручную, а функцию эту объявлю в нём, такое прокатит?smile.gif

Спустя 3 минуты, 56 секунд (31.10.2009 - 18:00) WildeR написал(а):
Цитата (Ka4_0k @ 31.10.2009 - 14:56)
Спасибо большое! =) А если она будет находится сам в классе core ? Тоесть класс core я подключу вручную, а функцию эту объявлю в нём, такое прокатит?smile.gif

Думаю такое не прокатит:)ее надо "внеклассово" объявить.

Спустя 2 минуты, 4 секунды (31.10.2009 - 18:02) Ka4_0k написал(а):
Ладно, спасибо smile.gif Попробовал - работает, буду юзать. wink.gif Весёлая штука)

Спустя 1 час, 52 минуты, 48 секунд (31.10.2009 - 19:55) glock18 написал(а):
Ka4_0k
http://ru2.php.net/manual/en/function.spl-...ad-register.php

функция/метод подается в нее стандартно, как callback. А значит можно передать, и метод, и функцию.


--------------------
-Oh My God! They Killed Kenny!
-You Bastards!
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Закрытая темаСоздание новой темыСоздание опроса