2012-08-22 22 views
19

मेरे पास एक छोटा सा एप्लिकेशन है जिसके लिए मुझे एक ऑटोलोडर चाहिए। मैं आसानी से symfony2 वर्ग लोडर का उपयोग कर सकता हूं लेकिन यह ओवरकिल की तरह लगता है।PHP - सबसे हल्के psr-0 अनुरूप ऑटोलोडर

क्या वहां कोई स्थिर हल्के पीएसआर -0 ऑटोलोडर है?

उत्तर

28

आप बेहद हल्के पूछना इसे स्थापित है, चलो ऐसा करने के लिए दे सकते हैं;)

टिमोथी Boronczyk एक अच्छा कम से कम एसपीएल autoloader लिखा है:

function autoload1($class) { 
    preg_match('/^(.+)?([^\\\\]+)$/U', ltrim($class, '\\'), $match)); 
    require str_replace('\\', '/', $match[ 1 ]) 
     . str_replace([ '\\', '_' ], '/', $match[ 2 ]) 
     . '.php'; 
} 
: http://zaemis.blogspot.fr/2012/05/writing-minimal-psr-0-autoloader.html

मैं इस तरह कोड सघन

फिर 0/[autoload4] के साथ इस [autoload3] की तुलना करें (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 सबसे छोटा है!

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

हो सकता है कि मैं पागल हूँ, लेकिन आप, चरम के लिए पूछे जाने पर कोई:

के स्थिर & बेहद हल्के (! 175b) autoloader फ़ाइल का उपयोग करते हैं?

संपादित करें: एलिक्स एक्सल के लिए धन्यवाद, मैं कोड (! केवल 100b) छोटा है और इस्तेमाल के बजाय शामिल मामले में की आवश्यकता होती है कि आप पुराने libs (और spl autoload ढेर में तो विभिन्न autoloader के लिए विभिन्न autoloading रणनीति है। ..)।

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

यदि आप इसे छोटा/बेहतर बनाना चाहते हैं, तो कृपया इस gist का उपयोग करें।

+4

+1, मैंने कोशिश नहीं की है, लेकिन मुझे लगता है कि यदि आप 'preg_match() '+' str_replace() ' –

+1

के बजाय' preg_replace()' का उपयोग करते हैं तो मेरा संस्करण भी छोटा हो सकता है। मुझे पूरा यकीन नहीं है कि 'preg_match() 'अन्य समकक्ष PHP विकल्पों की तुलना में तेज़ है। – TCB13

10

SplClassLoader सही विकल्प की तरह लगता है। यह एक कार्यान्वयन proposed by PSR-0 है।

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; 
} 

यह उपयोग बहुत सीधे आगे है:

+14

में रख यह वास्तव में क्या मैं "हल्के वजन" हकदार होता नहीं है। – cweiske

15

PSR-0 specification document एक examplary संगत autoloader समारोह पहले से ही बहुत कम है कि है

spl_autoload_register('autoload'); 

इसके साथ कमी है कि आप विन्यस्त करने की जरूरत है, आधार-निर्देशिका यह include_path निर्देश के साथ काम करती है।

$spl_autoload_register_psr0 = function ($extensions = null) 
{ 
    $callback = function ($className, $extensions = null) 
    { 
     if (!preg_match('~^[a-z0-9\\_]{2,}$~i', $className)) { 
      return; 
     } 
     null !== $extensions || $extensions = spl_autoload_extensions(); 
     $extensions = array_map('trim', explode(',', $extensions)); 
     $dirs = array_map('realpath', explode(PATH_SEPARATOR, get_include_path())); 

     $classStub = strtr($className, array('_' => '/', '\\' => '/')); 

     foreach ($dirs as $dir) { 
      foreach ($extensions as $extension) { 
       $file = sprintf('%s/%s%s', $dir, $classStub, $extension); 
       if (!is_readable($file)) { 
        continue; 
       } 
       include $file; 
       return; 
      } 
     } 
    }; 

    return spl_autoload_register($callback); 
}; 

The Symfony2 ClassLoader Component लाभ अधिक विन्यास यहाँ अनुमति देने के लिए है: एक संकर PSR-0 autoloaders एसपीएल अर्थ विज्ञान पर झुक का समर्थन करने के लिए, निम्न में से एक supportss पथ और spl autoload एक्सटेंशन शामिल हैं। आप आसानी से नाशपाती या संगीतकार (symfony/class-loader on Packagist) के माध्यम से इसे स्थापित कर सकते हैं। यह अपने आप पर एक घटक है जिसका उपयोग कई और काफी अच्छी तरह से परीक्षण और समर्थित द्वारा किया जाता है।

+0

पीएसआर -0 ऑटोलोडर के लिए एक्सटेंशन स्वीकार करने और मानक PHP पर काम करने के लिए उदाहरण पथ शामिल है: http://chat.stackoverflow.com/transcript/message/9066049#9066049 – hakre

+0

str_replace ('_', ... को मेरे लिए काम किया। – itsoft3g

4

the answer @hakre provided की एक सटीक बराबर, बस कम:

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); 
    } 
} 
0

यह सवाल का सीधा जवाब नहीं है, लेकिन मैंने पाया कि उपरोक्त उत्तरों स्टैंडअलोन PHP स्क्रिप्ट पर बहुत अच्छा काम करते थे, लेकिन जूमला जैसे कुछ ढांचे में उपयोग किए जाने पर समस्याएं पैदा कर रही थीं।

जूमला का उपयोग करने वाले किसी भी व्यक्ति के लिए, यह पता चला है कि पहले से ही ढांचे में बनाया गया एक संगत ऑटोलोडर है, इसलिए आपको उपर्युक्त कार्यों का उपयोग करने की आवश्यकता नहीं होगी। इस स्थिति में, सिर्फ उदाहरण के लिए JLoader :: registerNamespace() .... फोन:

JLoader::registerNamespace('Solarium', JPATH_LIBRARIES . DS . 'solarium-3.2.0' . DS . 'library'); 
0
function autoload($fullClassName) { 
    $name_elems = explode('\\', $fullClassName); 
    require __DIR__.DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR, $name_elems).'.php'; 
} 

यह भी तरह बातें समर्थन करता है: $ transformerContstraint = नए \ Recurr \ ट्रांसफार्मर \ बाधा \ AfterConstraint (नई दिनांक समय());

बस /vendor/Recurr/Transformer/Constraint/AfterConstraint.php