2013-02-13 39 views
6

क्या मेरे ऑटोलोड लोड फ़ंक्शन में लक्षणों और कक्षाओं के बीच अंतर करने का कोई तरीका है? मान लें कि मेरे पास कक्षाओं का एक फ़ोल्डर और लक्षणों का एक फ़ोल्डर है; ऐसा लगता है कि कुछ करने के लिए सक्षम होने के लिए अच्छा होगा ...PHP में ऑटोलोडिंग गुण

spl_autoload_register(function($resource) { 
    if (/* $resource is class */) { 
    include 'classes/'.$resource.'.php'; 
    } 
    if (/* $resource is trait */) { 
    include 'traits/'.$resource.'.php'; 
    } 
}); 
+1

अपने शायद करने के लिए अपने दूसरे 'if' बदलना चाहते' elseif' – shnisaka

+0

संभावना प्रतीत नहीं होता है:

मेरे autoload समारोह या तो लक्षण या वर्गों ले सकते हैं। कॉलबैक में दिए गए प्रतीक नाम के अलावा कोई जानकारी नहीं है। आपको शायद PHP – Phil

+0

@shnisaka के साथ एक बग उठाना चाहिए जो कोई समझ में नहीं आता है। यदि शर्तों पारस्परिक रूप से अनन्य हैं तो 'elseif' का उपयोग क्यों करें? – Phil

उत्तर

4

autoload कॉलबैक फ़ंक्शन केवल जानकारी में से एक टुकड़ा प्राप्त करता है; प्रतीक नाम अनुरोध किया। यह देखने का कोई तरीका नहीं है कि यह किस प्रकार का प्रतीक होना चाहिए।

आप क्या कर सकता है, autoload ढेर में अनेक कार्यों का रजिस्टर एक, वर्गों और अन्य लक्षण को संभालने के लिए stream_resolve_include_path() या कुछ इसी तरह, उपयोग कर रहा है जैसे

spl_autoload_register(function($className) { 
    $fileName = stream_resolve_include_path('classes/' . $className . '.php'); 
    if ($fileName !== false) { 
     include $fileName; 
    } 
}); 
spl_autoload_register(function($traitName) { 
    $fileName = stream_resolve_include_path('traits/' . $traitName . '.php'); 
    if ($fileName !== false) { 
     include $fileName; 
    } 
}); 
+0

धन्यवाद, मेरा त्वरित समाधान 'file_exists() 'का उपयोग करना था। मैंने पहले कभी 'stream_resolve_include_path()' का उपयोग नहीं किया है और दस्तावेज़ीकरण काफी अस्पष्ट है ... यह वास्तव में क्या करता है? और दो ऑटोलोड कार्यों को पंजीकृत करने के साथ क्या फायदे आते हैं? –

+0

@ सेविंगर वेल, 'शामिल' कॉन्फ़िगर किए गए 'include_path' का उपयोग करता है। 'file_exists() 'इस बारे में नहीं जानता है, जबकि' stream_resolve_include_path()' करता है। यह 'false_path' स्टैक के विरुद्ध दिए गए पथ को हल नहीं कर सकता है, तो यह' झूठा 'देता है – Phil

0

वहाँ जिस तरह से आप नाम पर एक सरल उपाय है आपके लक्षण मेरे आवेदन में प्रत्येक विशेषता का नाम trait_ (नाम) रखा गया है और इसे कक्षा फ़ोल्डर में रखा गया है।

उदाहरण के लिए मेरे trait_something को "trait.trait_something.php" फ़ाइल नाम के तहत कक्षा/फ़ोल्डर में रखा गया है।

function autoloader($class) 
{ 
    $prefix='classes/'; 
    $ext='.php'; 
    if(substr($class,0,6) == 'trait_')include $prefix.'trait.' . $class . $ext; 
    else include $prefix.'class.' . $class . $ext; 
}