2009-11-11 15 views
5

सर्वर साइड मैं एक नाशपाती निर्देशिका के लिए एक संदर्भ है पर मेरी include_path में, '/ usr/share/नाशपाती /' में। मेरे अनुप्रयोगों में मैं require_once 'library/file.php' के साथ '/ usr/share/नाशपाती/पुस्तकालय /' में रहने वाली एक सामान्य लाइब्रेरी से फ़ाइलें शामिल करता हूं।एसपीएल Autoloading सर्वोत्तम प्रथाओं

मैं हाल ही में spl autoloader उपयोग शुरू कर दिया है, मैं लोडर समारोह आप तर्क है जिसके साथ फ़ाइल शामिल करने के लिए निर्धारित करने के लिए है में देखा। ऐसा करने का मेरा पहला तरीका फ़ाइल को शामिल करने और @ के साथ इसे दबाने की कोशिश कर रहा था यह देखने के लिए कि क्या यह असफल होगा, उदा। @include 'library/file.php' हालांकि मुझे लगता है कि ज्यादातर @ खराब अभ्यास होने के कारण मैंने get_include_path को PATH_SEPARATOR द्वारा विस्फोट करके मैन्युअल रूप से स्वयं काम करने का निर्णय लिया और यह देखकर कि निर्देशिका क्या है, मैं इसे file_exists और इसमें शामिल कर रहा हूं ।

तो जैसा:

function classLoader($class) { 
    $paths = explode(PATH_SEPARATOR, get_include_path()); 
    $file = SITE_PATH . 'classes' . DS . $class . '.Class.php'; 
    if (file_exists($file) == false) 
    { 
     $exists = false; 
     foreach ($paths as $path) 
     { 
      $tmp = $path . DS . 'library' . DS . 'classes' . DS . $class . '.Class.php'; 
      if (file_exists ($tmp)) 
      { 
      $exists = true; 
      $file = $tmp; 
      } 
     } 
     if (!$exists) { return false; } 
    } 
    include $file; 
} 

spl_autoload_register('classLoader'); 

मैं गलत मार्ग गए थे? क्या मैंने अभी @include व्यवसाय किया है या क्या मैं इसे सही दिशा में कुछ हद तक कर रहा हूं?

उत्तर

6

एक बात यह है कि Habari project autoloader यह दिलचस्प है कि पूरी कक्षा फ़ाइल सूची मेमोरी में कैश करे ताकि वह कक्षा के अनुरोध के दौरान फ़ाइलों के लिए डिस्क खोज नहीं कर रहा हो।

अनिवार्य रूप से, आप अपने __autoload() के अंदर एक स्थिर घोषित करते हैं, जिसमें कक्षा द्वारा अनुक्रमित सभी वर्ग फ़ाइलों की एक सरणी होती है जो उन्हें लोड करने का कारण बनती हैं। उदाहरण के लिए, कोड डिर या glob() का उपयोग इस स्थैतिक सरणी उत्पन्न करने के लिए होगा:

$class_files = array(
    'user' => '/var/www/htdocs/system/classes/user.class.php', 
); 

तो फिर तुम बस शामिल $class_files[$class] सही फ़ाइल प्राप्त करने के लिए। यह अच्छा और तेज़ है क्योंकि सूची को उत्पन्न करने या प्रत्येक बार एक नई कक्षा के संदर्भ में एक विशिष्ट फ़ाइल नाम की खोज करने के बजाय, डिस्क को कैटलॉग मिल जाता है। (आप आश्चर्यचकित होंगे कि यह कितना गति अंतर बनाता है।)

यदि वर्ग का नाम सरणी में एक कुंजी नहीं है, तो आप एक कस्टम अपवाद फेंक सकते हैं या वापसी के लिए स्टब/नकली कक्षा उत्पन्न कर सकते हैं। इसके अलावा, यदि आप हबरी सिस्टम ऑटोलोडर को देखते हैं, तो आप देखेंगे कि हबारी ऑटोलोडेड वाले वर्गों में __static() लागू करता है, जो स्थैतिक वर्गों के लिए एक कन्स्ट्रक्टर की तरह है।

include_once() से बचा जाना है, और @ ऑपरेटर अनावश्यक है यदि आपने फ़ाइल को शामिल करने के लिए चेक किया है।

1

मैं व्यक्तिगत रूप से भी @ डिबगिंग को कम करने के बिना

function autoload($class) { 
    /* transform class name into filename ... */ 
    include $class; 
} 

का उपयोग कर रास्ता तय (त्रुटियों बंद हो जाते हैं/उत्पादन में लॉग इन)

तुम भी पीएचपी पर संबंधित चर्चा में रुचि हो सकती डेवलपर सूची: http://marc.info/?t=125787162200003&r=1&w=2

+3

spl अधिक व्यावहारिक और आधुनिक विधि Autoloading नहीं है? या वे मूल रूप से एक ही बात हैं? –

संबंधित मुद्दे