2012-08-26 22 views
6

मैं कुछ वर्गों और इंटरफेस के साथ php में नेमस्पेस का उपयोग करने का प्रयास कर रहा हूं।PHP नेमस्पेस और इंटरफेस

ऐसा प्रतीत होता है कि मुझे इंटरफ़ेस और कंक्रीट प्रकार दोनों का उपयोग करने के लिए एक उपयोग कथन रखना होगा। यह निश्चित रूप से इंटरफेस का उपयोग करने के उद्देश्य को हरा रहा है? इस निश्चित रूप से है कि के खिलाफ जाता है -

तो मैं

//Interface 
namespace App\MyNamesapce; 
interface MyInterface 
{} 

//Concrete Implementation 
namespace App\MyNamesapce; 
class MyConcreteClass implements MyInterface 
{} 

//Client 
namespace App; 
use App\MyNamespace\MyInterface // i cannot do this!!!! 
use App\MyNamespace\MyConcreteClass // i must do this! 
class MyClient 
{} 

Isnt इंटरफेस के पूरे मुद्दे ताकि ठोस प्रकार परस्पर विनिमय कर रहे हो सकता है। जब तक मैं कुछ सही तरीके से नहीं कर रहा हूं

उत्तर

5

ठोस कार्यान्वयन अस्थायी है, लेकिन आपको कहीं भी निर्दिष्ट करने की आवश्यकता है कि आप किस कार्यान्वयन का उपयोग करना चाहते हैं, है ना?

// Use the concrete implementation to create an instance 
use \App\MyNamespace\MyConcreteClass; 
$obj = MyConcreteClass(); 

// or do this (without importing the class this time): 
$obj = \App\MyNamespace\MyConcreteClass2(); // <-- different concrete class!  

class Foo { 
    // Use the interface for type-hinting (i.e. any object that implements 
    // the interface = every concrete class is okay) 
    public function doSomething(\App\MyNamespace\MyInterface $p) { 
     // Now it's safe to invoke methods that the interface defines on $p 
    } 
} 

$bar = new Foo(); 
$bar->doSomething($obj); 
+0

तो 'उपयोग नामस्थान' का उपयोग करने के बजाय बस कक्षा के लिए पूर्ण पथ का उपयोग करें? –

+1

जरूरी नहीं है, आप कक्षा को वर्तमान नामस्थान में भी आयात कर सकते हैं। यह सिर्फ शैली का मामला है। – Niko

+0

हां, मैं बस सोच रहा था कि एक इंटरफ़ेस का उपयोग करने के बाद से मैं नामस्थान को इंटरफेस बनाना चाहता हूं - लेकिन वास्तव में प्रतिबिंब पर जो कोई समझ नहीं लेता है। निर्भरता इंजेक्शन का उपयोग करने के लिए एक बेहतर विकल्प होगा, मुझे लगता है कि कभी भी एक वर्ग को तत्काल नहीं बदला जा सकता है? –

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