कक्षा और इंटरफेस php के बीच difolernece autoloadece

मैं अपने पास निम्नलिखित मुद्दे की तलाश कर रहा हूं। हमारे प्रोजेक्ट के क्लास फ़ाइल नामों को logon.class.php नाम दिया गया है लेकिन उस वर्ग के लिए इंटरफ़ेस फ़ाइल को logon.interface.php नाम दिया गया है

मेरी समस्या यह है कि जब स्वत: लोड विधि चलती है तो मुझे यह पता लगाने में सक्षम होना चाहिए कि यह क्लास कॉल या इंटरफ़ेस कॉल है या नहीं।

<?php 
function __autoload($name){
    if($name === is_class){
        include_once($name.'class.php');
    }elseif ($name === is_interface){
         include_once($name.'interface.php');
    }
}
?>
2
आप एक ही नाम के साथ एक वर्ग और एक इंटरफेस को परिभाषित कैसे कर सकते हैं और दोनों का उपयोग करने की उम्मीद करते हैं? इसे चलाने का प्रयास करें: class x {} इंटरफ़ेस x {}
जोड़ा लेखक Explosion Pills, स्रोत
मैं करता हूं जो स्टूश भी करता है। मेरे पास interfaces के लिए IClassName है, कक्षाओं के लिए सार वर्गों और CClassname के लिए AClassName।
जोड़ा लेखक F21, स्रोत
@Tandu के अलावा, आपको गंभीरता से पीएसआर -0 । गंभीरता से।
जोड़ा लेखक igorw, स्रोत
मैं आमतौर पर फ़ाइल नाम और इंटरफ़ेस नाम की शुरुआत में I जोड़ता हूं
जोड़ा लेखक Stoosh, स्रोत
अतीत में मैंने इंटरफ़ेस से पहले भी इस उपसर्ग का उपयोग किया था। लेकिन अब नेमस्पेस के उपयोग के साथ, मेरे पास इंटरफेस के लिए एक नेमस्पेस विशिष्ट है
जोड़ा लेखक Jan Van Looveren, स्रोत

3 उत्तर

क्लास एक इंटरफेस है या नहीं, यह निर्धारित करने के लिए आप ReflectionClass :: isInterface का उपयोग कर सकते हैं ।

$reflection = new ReflectionClass($name);

if ($reflection->isInterface()){
  //Is an interface
}else{
  //Not an interface
}

आपके मामले में, आपको शायद $ name.interface.php और $ name.class.php पर file_exist का उपयोग करना होगा, यह निर्धारित करने के लिए कि क्या वे मौजूद हैं, मौजूद एक की आवश्यकता है, तो जांचें कि यह एक इंटरफ़ेस है या नहीं।

हालांकि, मेरी राय यह है कि इससे ट्रैक कम हो सकती है। क्या होगा यदि आपके पास MyClass.class.php और MyClass.interface.php है?

3
जोड़ा
इसके लिए कक्षा का एक उदाहरण की आवश्यकता है ..
जोड़ा लेखक Explosion Pills, स्रोत
आप सही हैं, लेकिन आप केवल उन वर्गों के लिए ऐसा कर सकते हैं जो पहले से मौजूद हैं।
जोड़ा लेखक Explosion Pills, स्रोत
@tandu, ReflectionClass 'contructor को एक उदाहरण की आवश्यकता नहीं है। आप कक्षा के नाम की एक स्ट्रिंग में पास कर सकते हैं।
जोड़ा लेखक F21, स्रोत
@xdazz: कृपया विस्तृत करें :)
जोड़ा लेखक F21, स्रोत
ऑटोलोड में प्रतिबिंब का उपयोग करना एक बहुत बुरा विचार है।
जोड़ा लेखक xdazz, स्रोत

कक्षा नाम संघर्ष से बचने के लिए आप नामस्थान का उपयोग कर सकते हैं। पीएसआर -0 विनिर्देशों की जांच करें।

यह भी पोस्ट देखें । यदि आप इसे शामिल करने से पहले फ़ाइल की सामग्री को पढ़ते हैं, तो आप इसे टोकनइज़ कर सकते हैं और यह समझ सकते हैं कि फ़ाइल में इंटरफ़ेस या क्लास है, वास्तव में कक्षा/इंटरफ़ेस लोड किए बिना। ध्यान रखें कि इंटरफेस और कक्षाओं का एक ही नाम नहीं हो सकता है

नोट: इस विधि का उपयोग करके आप वास्तव में रनटाइम पर इंटरफ़ेस का नाम बदल सकते हैं (कक्षा लोड करने से पहले, हालांकि यह बहुत अच्छा अभ्यास प्रतीत होता है)

0
जोड़ा

आपके कक्षाओं और इंटरफेस के लिए आपके पास कुछ नामकरण सम्मेलन होना चाहिए। आपका वर्ग नाम लॉगऑन और इंटरफ़ेस नाम logon_interface है, तो आप दोनों के बीच आसानी से अंतर कर सकते हैं। उदाहरण के लिए, अंडरस्कोर द्वारा $ name विस्फोट करें और जांचें कि अंतिम तत्व इंटरफ़ेस है या नहीं।

0
जोड़ा