2010-12-07 9 views
8

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

<?php 
interface IMyInterface 
{ 
    public function doSomething(); 
} 
?> 

<?php 
class ConcreteImplOfMyInterface implements IMyInterface 
{ 
    const NotPartOfInterface = 'youcantseeme'; 

    public function doSomething() 
    { 
    } 
} 
?> 

<?php 
class MyInterfaceFactory 
{ 
    public static function createMyInterface() 
    { 
     return new ConcreteImplOfMyInterface(); 
    } 
} 
?> 

<?php 
function client() 
{ 
    $myInterface = MyInterfaceFactory::createMyInterface(); 
    return $myInterface::NotPartOfInterface; 
} 
?> 

उत्तर

6

जो आप पूछ रहे हैं वह केवल स्थिर रूप से टाइप की गई भाषा के साथ ही संभव है, और चूंकि PHP गतिशील रूप से टाइप किया गया है, इसलिए संक्षिप्त उत्तर यह है कि यह संभव नहीं है।

उदाहरण के लिए, जावा में, createMyInterfaceIMyInterface वापस कर सकता है, और इस ऑब्जेक्ट पर केवल एक ही संभावित ऑपरेशन इंटरफ़ेस में परिभाषित हैं। बेशक, वस्तु वास्तव में ConcreteImplOfMyInterface प्रकार है, इसलिए आप इसे अन्य फ़ील्ड/विधियों तक पहुंचने के लिए हमेशा उस प्रकार पर डाल सकते हैं।

PHP के पास कोई घोषित प्रकार नहीं है, इसलिए आप किसी फ़ंक्शन से वापस लौटते हैं, यह केवल "चर" है - इसमें कोई प्रकार नहीं है। और क्योंकि वहां कोई प्रकार नहीं है, सभी फ़ील्ड/विधि लुकअप गतिशील हैं, इसलिए ऑब्जेक्ट में "वहां" कुछ भी हमेशा एक्सेस किया जा सकता है।

एक तरह से, इंटरफ़ेस वास्तव में PHP जैसे किसी भाषा में उपयोग में सीमित हैं - किसी भी वर्ग जो इंटरफ़ेस लागू करता है उसे अपने सभी तरीकों को लागू करना होगा, लेकिन इस बात की कोई गारंटी नहीं है कि कोई फ़ंक्शन किस प्रकार वापस आ सकता है पहली जगह, अनिवार्य रूप से कुछ भी गारंटी नहीं है। सबसे अच्छा आप यह कर सकते हैं कि अज्ञात चर किसी दिए गए इंटरफ़ेस को लागू करता है या नहीं, यह जांचने के लिए instanceof का उपयोग करना है।

1

तरीकों को निजी बनाएं:

यहाँ एक उदाहरण है।

return $myInterface.NotPartOfInterface; 

क्या यह काम करता है? मुझे नहीं लगता कि यह चाहिए। मुझे लगता है कि आप :: ऑपरेटर चाहते हैं।

. केवल तारों को संयोजित करने के लिए उपयोग किया जाता है।

9

यही कारण है कि इंटरफेस PHP में अच्छा कर रहे हैं:

interface Printable{ 
    public function display(); 
} 

function display(Printable $obj){ 
    $obj->display(); 
} 

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

पीएचपी 5.1 http://php.net/manual/en/language.oop5.typehinting.php

क्या आप वाकई किसी और विशिष्ट तरीकों या एक वर्ग के चर का उपयोग करने में सक्षम नहीं है बनाना चाहते हैं, तो आप private के रूप में उन तरीकों और चर निर्धारित करने होंगे। यह उन्हें उस विशिष्ट वर्ग के अलावा किसी भी चीज़ द्वारा उपयोग करने में असमर्थ बना देगा। (यहां तक ​​कि आपकी कक्षा का विस्तार करने वाली कक्षाएं भी उनका उपयोग नहीं कर सकती हैं)

+0

अच्छी सामग्री के लिए +1 – alex

+0

मैं ओओपी एक्सेस संशोधक समझता हूं और मुझे पता है कि PHP में टाइपिंग संकेत है। तथ्य यह है कि फ़ंक्शन रिटर्न प्रकारों पर टाइप संकेत नहीं है, हालांकि इंटरफ़ेस मेरे लिए व्यर्थ प्रकार की तरह दिखता है। क्या होगा यदि मैं एक ही लॉजिकल घटक में कक्षाओं को एक-दूसरे पर सार्वजनिक तरीकों को कॉल करने में सक्षम होना चाहता हूं, लेकिन मैं उस घटक को सार्वजनिक इंटरफेस का पर्दाफाश करने के लिए पूरी तरह से चाहता था जो कि उस घटक के साथ संवाद करने का एकमात्र तरीका था? यह PHP में संभव प्रतीत नहीं होता है। – jameswelle

+0

एक दिलचस्प बात यह है कि आप वर्तमान वर्ग के उदाहरणों की संरक्षित और यहां तक ​​कि निजी विधि/चर तक पहुंच सकते हैं। उदाहरण के लिए, यदि उपयोगकर्ता श्रेणी में निजी संपत्ति $ टोकन है तो आपके पास उपयोगकर्ता वर्ग के अंदर एक विधि हो सकती है: सार्वजनिक फ़ंक्शन चेंज टोकन (उपयोगकर्ता $ उपयोगकर्ता) {$ उपयोगकर्ता-> टोकन = '1234'; } – Joe

2

चूंकि PHP एक गतिशील भाषा है, इसका मतलब है कि कक्षा के सभी सदस्यों तक पहुंच, रनटाइम पर हल हो जाएगी। जिसका अर्थ है कि अगर मेरे पास कोड है जो $ foo-> bar() को कॉल करता है और मुझे $ foo में ऑब्जेक्ट मिला है जिसमें बार() नामक विधि है तो यह कॉल किया जाएगा, भले ही यह विधि बार() हो जिसे मैं कॉल करना चाहता हूं लेकिन किसी अन्य वस्तु पर कुछ अन्य विधि जो संयोग से समान है।

हालांकि, कहा जा रहा है, आप कुछ सुरक्षा टाइप किया पैरामीटर का उपयोग कर समारोह केवल विशिष्ट वस्तुओं को स्वीकार करने के लिए द्वारा प्रदान कर सकते हैं:

function doingSomething(IMyInterface $foo) { 
    $foo->doSomething(); 
} 

हालांकि, आप अभी IMyInterface को लागू करने के लिए और फिर कार्यों लिखने से किसी को भी निषेध नहीं कर सकते हैं कि IMyInterface को स्वीकार करें लेकिन इसका उपयोग करें जैसे कि यह कुछ उच्च वर्ग का उद्देश्य था। जैसा कि मैंने कहा, यह PHP गतिशील भाषा होने के कारण है।

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

  • कोई संबंधित समस्या नहीं^_^