Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Traits autoload


Автор: MoLeX 16.1.2012, 08:12
Доброе утро.
Столкнулся с проблемой в автозагрузке trait'ов, в итоге родился грязный костыль. 

index.php
Код

ini_set('include_path', '/trait/');

function __autoload( $class )
{
    require $class.'.php';    
}

function load_class( $class = null )
{
    static $obj = array();

    if( $class === null )
        exit( 'Class name is null '.$class );
    
    if( ! isset( $obj[$class] ) )
    {
        $load = '/classes/'.mb_strtolower( $class ) . '.php';

        if( ! file_exists( $load ) )
            exit( 'File class is not found '.$load );
        include $load;
        
        $obj[$class] = new $class();
    }

    return $obj[$class];
}

$test = load_class('test');
$test->t();


classes/test.php
Код

class test
{
    use MyTrait;
}



trait/mytrait.php
Код

trait MyTrait
{
    public function t()
    {
        echo __METHOD__;
    }
}


Но такое способ не тру( 
Может существует более элегантное решение?

P.S. допустим все классы лежат в папке classes, а трейты в trait

Добавлено через 46 секунд
Можно конечно сделать так
Код

spl_autoload_register('load_class');

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

Автор: ksnk 16.1.2012, 08:57
чем не подходят варианты
Код

ini_set('include_path', '/trait/'.PATH_SEPARATOR .'/classes/');
function __autoload( $class )
{
    require $class.'.php';    
}
$test=new test();
$test->t();


Код

//ini_set('include_path', '/trait/'.PATH_SEPARATOR .'/classes/');
function __autoload( $class )
{
    if(strtolower($class{0})==$class{0}) {// first letter is lowercase - so it's classes
       if(file_exists ('/classes/'.$class.'.php')) {
             include('/classes/'.$class.'.php');
             return ;
      }
    if(file_exists ('/trait/'.$class.'.php')) {
             include('/trait/'.$class.'.php');
             return;
    }
    require $class.'.php';    
}
$test=new test();
$test->t();


Автор: MoLeX 16.1.2012, 09:00
ksnk, огород нагородил) а забыл что можно сделать простую проверку на существование файла и подключить его

Автор: krundetz 16.1.2012, 11:39
Цитата(MoLeX @  16.1.2012,  09:00 Найти цитируемый пост)
ksnk, огород нагородил) а забыл что можно сделать простую проверку на существование файла и подключить его 

напрашивается ещё проверка на существование самого trait

Автор: Sanchezzz 16.1.2012, 20:50
причем и то и то лучше подрубать только один раз) 

Автор: MoLeX 17.1.2012, 06:13
Sanchezzz, а так и происходит. если класс уже вызывался, его экземпляр из статичной переменой возвращается

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)