Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> загрузка класса 
V
    Опции темы
bars80080
Дата 7.11.2011, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



что-то я почитал про автозагрузчики, и видимо не понял глобальной идеи

мне нужно, чтобы при использовании класса он уже был в загружен (а он сидит в отдельном файле, так как не факт, что понадобится)

допустим, перед тем местом где я его собираюсь использовать, я делаю так:

Код

$mainClassObject->loadclass('someclass');

....
    function loadclass($name) {
        $f = $this->Path['lib'].'/class.'.$name.'.php';
        include_once($f);
    }


но вот бы ещё неплохо запустить этот класс. то есть засунуть в этот метод ещё и:

Код

$mainClassObject->objects['someclass'] = new someclass($arg1, $arg2...);


понимаю, что сие можно сделать только через call_user_func(), так как требуется ещё и аргументов неопределённое число туда закинуть


вопрос: а не делаю ли я велосипед с квадратными колёсами?
PM MAIL WWW   Вверх
CruorVult
Дата 7.11.2011, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 868
Регистрация: 24.9.2008
Где: г.Киев, Украина

Репутация: 9
Всего: 28



http://php.net/manual/ru/language.oop5.autoload.php

Добавлено через 32 секунды
Цитата(bars80080 @  7.11.2011,  16:21 Найти цитируемый пост)
что-то я почитал про автозагрузчики, и видимо не понял глобальной идеи

аа)))

Добавлено через 1 минуту и 14 секунд
Цитата(bars80080 @  7.11.2011,  16:21 Найти цитируемый пост)
а не делаю ли я велосипед

пару строк кода - это впринципе не велосипед
PM MAIL Skype   Вверх
ksnk
Дата 7.11.2011, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



spl_autoload
Внизу в комментариях примеры разных применений и настроек.

Цитата(bars80080 @  7.11.2011,  16:21 Найти цитируемый пост)
 вот бы ещё неплохо запустить этот класс. то есть засунуть в этот метод ещё и:


после описания класса, внизу приписать инициализацию?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
z-END
Дата 7.11.2011, 17:16 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: 5
Всего: 102



Код

<?
######## classes/test1.php
class test1 {
    private $p1 = false;
    private $p2 = false;
    function __construct ($param1, $param2){
        $this->p1 = $param1;
        $this->p2 = $param2;
    }
    function  dump (){
        var_dump ($this);
    }
}

######## classes/test2.php
class test2 {
    private $p1 = 1;
    private $p2 = 2;
    function __construct(){
    }
    function  dump (){
        var_dump ($this);
    }
}


class mainClassObject {    
    public $var = '1';

        function __call ($class, $params) {
            $classFile = 'classes/' . $class . '.php';

            if (!class_exists($class)) {
                if (is_file ($classFile))  
                    require_once ($classFile);
                else 
                    trigger_error ('class not found');
            }
                
            if (count ($params)) 
                $params = implode ("," , $params);        
            else 
                $params = '';
            eval ('$_class = new '.$class.'('.$params.');');
            $this->$class = $_class;
         }
         
}
$mainClassObject = new mainClassObject();

// подрубание класса
$mainClassObject->test1('test1','test2');
$mainClassObject->test2();

//использование класса
$mainClassObject->test1->dump();
$mainClassObject->test2->dump();




--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
gta4kv
Дата 7.11.2011, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



z-END, ужасный пример, кошмар просто. Еще и eval туда вписали.
PM MAIL   Вверх
MoLeX
Дата 8.11.2011, 05:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



eval - это не тру.

Добавлено через 5 минут и 58 секунд
bars80080, тоже сталкивался с этим. красивое решение не нашел, поэтому добавляю в класс метод init()


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
ksnk
Дата 8.11.2011, 07:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Когда я решал подобную задачу - основной проблемой, почему я не пользовался стандартным autoload было то, что у меня были несколько файлов - "библиотек" классов. В одном файле - много маленьких классиков. Понятно, что Zend рекомендует именно один класс на файл, но что за дела? Почему я ОБЯЗАТЕЛЬНО должен хранить 40 файлов на 20 строк, вместо одного на 800? Почему стандартные средства автолода не могут такого?

вот так указываются, из каких файлов и каких каталогов брать "нестандартные" классы и плагины
Код

LoadClass(array(
// модули
    'Auth'=>ROOT_PATH.'/'.ADMIN.'/engine/users.php',
    'html_mime_mail'=>ROOT_PATH.'/'.ADMIN.'/engine/sendmail.php',
    'form'=>ROOT_PATH.'/'.ADMIN.'/engine/users.php',

// плагины
    'sitemap'=>ROOT_PATH.'/engine/plugins/',
    'bannerlist'=>ROOT_PATH.'engine/plugins/',
    'fileman'=>ROOT_PATH.'.engine/plugins/',
    'massmail'=>ROOT_PATH.'/engine/plugins/',
...
    'basket'=>ROOT_PATH.'/engine/plugins/katalog.php',
    'katalog'=>ROOT_PATH.'/engine/plugins/katalog.php',
    'novinki'=>ROOT_PATH.'/engine/plugins/katalog.php',
...
));

применение в рантайм
Код

$cache = LoadClass('FileCache',array(array(
    'is_enabled' => ($_SERVER['REQUEST_METHOD']=='GET'
            && !in_array(pps($_GET['do']),array('search','basket','writeus', 'logout'))
            && !in_array(pps($_GET['id']),array('search','basket','writeus'))
        ),
    'dir'   => 'cache/',
    'ttl'   => 60 * 60 * 3,  #3 часа
    'cleaning_probability' => 100,
    'group' => $group,
    'hash'  => $page_hash,
    'user_id' => ppi($_SESSION['USER_ID']),
)));


Код

/**
 *  включим класс X, находящийся в файле Y
 */
function includeit($x,&$y){
    if(!empty($y))
        include_once($y);
    else
        include_once($x.'.php');    
}

function &LoadClass($cls,$param=0){
    static  $class_record=array(),
            $path_record=array();
    
    if(is_string($cls)){ 
        // checking dependence
        $class_name = $cls;
        if(!class_exists($class_name))
            includeit($class_name,$path_record[$class_name]);
        if (isset($class_record[$cls])){
            // checking class itself
            $class_name = $class_record[$cls];    
            if(!class_exists($class_name))
                includeit($class_name,$path_record[$class_name]);
        } 
        $result=null;    
        // creating an object
        if(!class_exists($class_name))
            return $result;
        if(is_array($param))
        switch(count($param)){
            case 1:  
                $result=&new $class_name(&$param[0]) ;
                break; 
            case 2:  
                $result=&new $class_name(&$param[0],&$param[1]) ;
                break;
            default:
                $result=&new $class_name() ;
        }
        else
            $result=&new $class_name() ;
        return $result;
        
    }
    
    // is_array($cls) - configuration 
    
    foreach($cls as $k=>$v){
        if(is_string($v))
            $v=array($k,$v);
        
        if($v[0])
            $class_record[$k]=$v[0];
        if(isset($v[1])){
            if(substr($v[1],-1,1)=='/')
                $path_record[$v[0]]=$v[1].$v[0].'.php';
            else
                $path_record[$v[0]]=$v[1];
        }
    }
    return $reg_record ;
}






--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
MoLeX
Дата 8.11.2011, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



Код

        switch(count($param)){
            case 1:  
                $result=&new $class_name(&$param[0]) ;
                break; 
            case 2:  
                $result=&new $class_name(&$param[0],&$param[1]) ;
                break;
            default:
                $result=&new $class_name() ;
        }


такой способ многие фр-ки используют. но если параметров 20? то ужас же


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
ksnk
Дата 8.11.2011, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(MoLeX @  8.11.2011,  07:57 Найти цитируемый пост)
такой способ многие фр-ки используют. но если параметров 20? то ужас же 

Это пИсано было для себя и под себя. А у меня, если параметров больше 2-х, то передается ассоциированный массив.
А как еще? eval'ом пользоваться - указатели не удастся передать, да и некошерно. Reflection'ы сильно утяжеляют реализацию...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
z-END
Дата 8.11.2011, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: 5
Всего: 102



Цитата(MoLeX @  8.11.2011,  08:57 Найти цитируемый пост)
такой способ многие фр-ки используют. но если параметров 20? то ужас же

собсно по этому я в примере eval и написал.  хочешь автоматизацию - плати за скорость) 



--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
ksnk
Дата 8.11.2011, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



z-END, eval - ОЧЕНЬ медленная функция. Платить скоростью за скорость - не окупится  smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
gta4kv
Дата 8.11.2011, 10:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



А теперь, объясните мне, чем не подходит autoload под цели описанные bars80080?

Добавлено через 4 минуты и 28 секунд
bars80080

Цитата

но вот бы ещё неплохо запустить этот класс.


Так а в чем смысл автолоада, ты думаешь?

Рассмотрим на твоей задаче, делаем автолоад:

Код

function __autoload($class) 
{
    require_once $this->Path['lib'] . "/class.{$name}.php";
}


Потом ты в коде делаешь, например:
Код

$class  = new Database($any, $args, $going, $here);


Какие проблемы?
PM MAIL   Вверх
ksnk
Дата 8.11.2011, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



... ( не подумал, сорри ) smile

Это сообщение отредактировал(а) ksnk - 8.11.2011, 10:57


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
gta4kv
Дата 8.11.2011, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



и?
PM MAIL   Вверх
ksnk
Дата 8.11.2011, 11:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



gta4kv, У меня это текст еще с 4-ки. Там просто не было автолода...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1588 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.