2008-11-05 11 views
7

मेरे पास मेरी PHP लाइब्रेरी में कई स्थिर फैक्ट्री पैटर्न हैं। हालांकि, स्मृति पदचिह्न हाथ से बाहर हो रहा है और हम निष्पादन समय के दौरान आवश्यक फ़ाइलों की संख्या को कम करना चाहते हैं।स्थैतिक फैक्ट्री पैटर्न का उपयोग करते समय PHP पुस्तकालयों को शामिल करने का सबसे अच्छा तरीका क्या है?

require_once('Car.php'); 
require_once('Truck.php'); 

abstract class Auto 
{ 
    // ... some stuff ... 

    public static function Create($type) 
    { 
     switch ($type) { 
      case 'Truck': 
       return new Truck(); 
       break; 
      case 'Car': 
      default: 
       return new Car(); 
       break; 
     } 
    } 
} 

इसका कारण यह है Car.php और Truck.php भी केवल एक या दूसरे की जरूरत हो सकती है, हालांकि शामिल करने की आवश्यकता होगी अवांछनीय है: यहाँ है जहाँ हम आज कर रहे हैं का एक उदाहरण है। जहां तक ​​मुझे पता है, आवश्यकता/शामिल है और उनके ..._ एक बार विविधता में पुस्तकालयों को एक ही दायरे में शामिल किया गया है, क्योंकि यह कॉल है। क्या ये सच है?

यदि हां, तो मेरा मानना ​​है कि यह एक स्मृति रिसाव के लिए नेतृत्व करेंगे:

abstract class Auto 
    { 
     // ... some stuff ... 

     public static function Create($type) 
     { 
      switch ($type) { 
       case 'Truck': 
        require_once('Truck.php'); 
        return new Truck(); 
        break; 
       case 'Car': 
       default: 
        require_once('Car.php'); 
        return new Car(); 
        break; 
      } 
     } 
    } 

ऐसा नहीं है कि 2 उदाहरण में, बनाने के लिए कई कॉल (मेरे लिए लग रहा है) एक से अधिक करने के लिए नेतृत्व करेंगे के दायरे की वजह से की आवश्यकता है कॉल की आवश्यकता होती है भले ही requ_once स्वाद का उपयोग किया जाता है।

क्या यह सच है? उदाहरण के रूप में php में गतिशील रूप से पुस्तकालयों को शामिल करने का सबसे अच्छा तरीका क्या है?

धन्यवाद!

उत्तर

7

ऑटोलोड लोड अक्सर ईविल के रूप में देखा जाता है, लेकिन यह इन कार्यों पर काफी अच्छी तरह से काम करता है।

यदि आप एक अच्छी फाइल सिस्टम < -> क्लासनाम मैपिंग प्राप्त कर सकते हैं ताकि आप कक्षा को प्रदान करने के लिए दिया जा सके, तो इसे ढूंढें, फिर यह आपको ओवरहेड बचाएगा और आवश्यकता होने पर केवल कक्षा लोड करेगा।

यह स्थैतिक वर्गों के लिए भी काम करता है, इसलिए स्थिर वर्ग के दायरे में एक बार, इसे "एक बार फ़ाइल शामिल है" परीक्षण की आवश्यकता नहीं है, क्योंकि कक्षा पहले से ही प्रतीक तालिका में है।

तो फिर तुम सिर्फ

require("autoloader.php"); 
$x = new Car(); 
$x = new Bike(); 

बना सकते हैं और यह सिर्फ जब जरूरत में उन्हें लाएगा। अधिक जानकारी के लिए

Php.net/__autoload देखें।

+0

एक वाक्य रचनात्मक चीनी को स्वत: लोड कर रहा है, जिसके लिए स्थानीय स्तर पर स्कॉप्ड की आवश्यकता नहीं है? – thesmart

+0

जब फ़ाइल "आवश्यक" में कक्षा परिभाषाएं होती हैं, तो स्थानीय क्षेत्र के साथ कोई समस्या नहीं है।PHP जावा जैसे "आंतरिक वर्ग" का समर्थन नहीं करता है; सभी वर्गों को वर्तमान नामस्थान के "शीर्ष स्तर" पर परिभाषित किया गया है। –

2

मैं autoloader का उपयोग करने की सलाह दूंगा।

है, require_once() उपयोग नहीं करते या तो उपवर्ग की आवश्यकता होती है, लेकिन एक समारोह जो संदर्भित वर्ग लोड कर सकते हैं जब आप new Truck() या new Car() फोन कॉल करने के लिए autoloader अनुमति देता है।

स्मृति रिसाव प्रश्न के लिए, नहीं, require_once कोड ब्लॉक द्वारा स्कॉप्ड नहीं किया गया है।

0

requ_once फ़ंक्शन का बिंदु यह है कि कोई फर्क नहीं पड़ता, आप फ़ाइल को दो बार शामिल नहीं करेंगे और एक PHP त्रुटि के कारण कक्षा को फिर से परिभाषित नहीं करेंगे। इसलिए मेमोरी लीक के बारे में कोई चिंता नहीं है, अगर requ_once मारा जाता है, तो क्लास डीफ़ वैश्विक प्रतीक तालिका में केवल एक बार जाता है।

लेकिन इसके अलावा, हाँ ऑटोलोडर का उपयोग करें।

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

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