PHP-самый легкий psr-0 совместимый загрузчик

У меня есть крошечное приложение, для которого мне нужен загрузчик. Я мог бы легко использовать загрузчик класса symfony2, но это кажется излишним.

есть ли стабильный чрезвычайно легкий загрузчик psr-0?

7 ответов


вы спрашиваете чрезвычайно легкий, давайте сделаем это;)

Тимоти Борончик написал хороший минимальный загрузчик SPL:http://zaemis.blogspot.fr/2012/05/writing-minimal-psr-0-autoloader.html

Я сжал код следующим образом:

function autoload1( $class ) {
    preg_match('/^(.+)?([^\\]+)$/U', ltrim( $class, '\' ), $match ) );
    require str_replace( '\', '/', $match[ 1 ] )
        . str_replace( [ '\', '_' ], '/', $match[ 2 ] )
        . '.php';
}

затем сравните (уменьшенные версии) этого [autoload3] с короткий @Alix Axel код [autoload4] :

function autoload3($c){preg_match('/^(.+)?([^\\]+)$/U',ltrim($c,'\'),$m);require str_replace('\','/',$m[1]).str_replace(['\','_'],'/',$m[2]).'.php';}
function autoload4($c){require (($n=strrpos($c=ltrim($c,'\'),'\'))!==false?str_replace('\','/',substr($c,0,++$n)):null).str_replace('_','/',substr($c,$n)).'.php';}

autoload3 является самым коротким !

давайте использовать стабильный & чрезвычайно легкий (175В !) файл автозапуска:

<?php spl_autoload_register(function ($c){preg_match('/^(.+)?([^\\]+)$/U',ltrim($c,'\'),$m);require str_replace('\','/',$m[1]).str_replace(['\','_'],'/',$m[2]).'.php';});

может быть, я сумасшедший, но вы просили экстрим, нет?

EDIT: благодаря Аликс аксель, я сократил код (только 100b !) и используется include вместо require в случае, если у вас есть различная стратегия автозапуска для старых библиотек (а затем Различный автозапуск в стеке автозапуска spl...).

<?php spl_autoload_register(function($c){@include preg_replace('#\\|_(?!.+\\)#','/',$c).'.php';});

если вы хотите сделать его короче / лучше, пожалуйста, используйте этот суть.


на PSR-0 спецификация документа имеет examplary совместимую функцию автозапуска, которая уже довольно короткая:

function autoload($className)
{
    $className = ltrim($className, '\');
    $fileName  = '';
    $namespace = '';
    if ($lastNsPos = strripos($className, '\')) {
        $namespace = substr($className, 0, $lastNsPos);
        $className = substr($className, $lastNsPos + 1);
        $fileName  = str_replace('\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
    }
    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';

    require $fileName;
}

это использование довольно прямо вперед:

spl_autoload_register('autoload');

недостаток в том, что вам нужно настроить базовые каталоги, на которых он работает с


SplClassLoader кажется правильным выбором. Это реализация предложено PSR-0.


точный эквивалент ответ @hakre при условии, только короче:

function autoload($class) {
  $path = null;

  if (($namespace = strrpos($class = ltrim($class, '\'), '\')) !== false) {
    $path .= strtr(substr($class, 0, ++$namespace), '\', '/');
  }

  require($path . strtr(substr($class, $namespace), '_', '/') . '.php');
}

вы также можете установить базовый каталог, изменив $path = null; к другому значению или просто сделайте так:

$paths = array
(
    __DIR__ . '/vendor/',
    __DIR__ . '/vendor/phunction/phunction.php',
);

foreach ($paths as $path)
{
    if (is_dir($path) === true)
    {
        spl_autoload_register(function ($class) use ($path)
        {
            if (($namespace = strrpos($class = ltrim($class, '\'), '\')) !== false)
            {
                $path .= strtr(substr($class, 0, ++$namespace), '\', '/');
            }

            require($path . strtr(substr($class, $namespace), '_', '/') . '.php');
        });
    }

    else if (is_file($path) === true)
    {
        require($path);
    }
}

на doctrine classloader другой хороший выбор. Вы можете легко установить его с композитор


Это не прямой ответ на вопрос, но я обнаружил, что вышеуказанные ответы отлично работали на автономных PHP-скриптах, но вызывали проблемы при использовании в определенных фреймворках, таких как Joomla.

для тех, кто использует Joomla, оказывается, что в фреймворк уже встроен совместимый загрузчик, поэтому вам не нужно будет использовать вышеуказанные функции. В этом случае просто вызовите JLoader:: registerNamespace().... например:

JLoader::registerNamespace('Solarium', JPATH_LIBRARIES . DS . 'solarium-3.2.0' . DS . 'library');

function autoload($fullClassName) {
    $name_elems = explode('\', $fullClassName);
    require __DIR__.DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR, $name_elems).'.php';
}

Это даже поддерживает такие вещи, как: $transformerContstraint = new \Recurr\Transformer\Constraint\AfterConstraint (новый DateTime ());

просто поместите его в /vendor/Recurr/Transformer/Constraint / AfterConstraint.в PHP