2008-11-25 12 views
28

क्या php में "दोस्त" या "आंतरिक" के बराबर है? यदि नहीं, तो क्या इस व्यवहार को प्राप्त करने के लिए कोई पैटर्न है?PHP के समकक्ष दोस्त या आंतरिक

संपादित करें: क्षमा करें, लेकिन मानक PHP वह नहीं है जिसे मैं ढूंढ रहा हूं। मैं रिंगमास्टर ने क्या किया है इसके साथ कुछ ढूंढ रहा हूं।

मैं वर्ग है जो सी-शैली प्रणाली कर रहे है वापस अंत पर कॉल करता है और करतब दिखाने बोझिल बनने के लिए शुरू कर दिया है। मेरे पास ऑब्जेक्ट ए में फ़ंक्शन हैं जो ऑब्जेक्ट बी को पैरामीटर के रूप में लेते हैं और ऑब्जेक्ट बी में एक विधि को एक तर्क के रूप में स्वयं को पास करने के लिए कॉल करना होता है। अंतिम उपयोगकर्ता बी में विधि को कॉल कर सकता है और सिस्टम अलग हो जाएगा।

उत्तर

40

पीएचपी किसी भी दोस्त की तरह घोषणाओं का समर्थन नहीं करता। PHP5 __get और __set विधियों का उपयोग करके इसे अनुकरण करना संभव है और केवल स्वीकृत मित्र वर्गों के लिए बैकट्रैक का निरीक्षण करना संभव है, हालांकि ऐसा करने के लिए कोड बेकार है।

नहीं है कुछ sample code और PHP की साइट पर विषय पर चर्चा:

class HasFriends 
{ 
    private $__friends = array('MyFriend', 'OtherFriend'); 

    public function __get($key) 
    { 
     $trace = debug_backtrace(); 
     if(isset($trace[1]['class']) && in_array($trace[1]['class'], $this->__friends)) { 
      return $this->$key; 
     } 

     // normal __get() code here 

     trigger_error('Cannot access private property ' . __CLASS__ . '::$' . $key, E_USER_ERROR); 
    } 

    public function __set($key, $value) 
    { 
     $trace = debug_backtrace(); 
     if(isset($trace[1]['class']) && in_array($trace[1]['class'], $this->__friends)) { 
      return $this->$key = $value; 
     } 

     // normal __set() code here 

     trigger_error('Cannot access private property ' . __CLASS__ . '::$' . $key, E_USER_ERROR); 
    } 
} 

(कोड nerdclub पर tsteiner ने साबित कर दिया शुद्ध on bugs.php.net डॉट)

+15

यह एक प्यारा हैक है! मैं इसे प्यार करता हूँ और इसके द्वारा रद्द कर दिया जाता है। चतुर हालांकि। +1 –

+1

इस तरह के प्रदर्शन क्या है? क्या यह एक उल्लेखनीय हिट है? यह वास्तव में वही होगा जो मैं ढूंढ रहा हूं। – smack0007

+0

यह encapsulation के लिए एकदम सही है। अब मेरे पास गेटर्स के बिना एक मुख्य श्रेणी है, एक एक्सेसर जो गेटर्स को लागू करता है और एक व्यू कौन है जो गेटर्स का उपयोग कर सकता है। +100 अगर मैं –

-13

मुझे यकीन है कि आप जो भी खोज रहे हैं वह आपके संरक्षित मामले के आधार पर "संरक्षित" या "निजी" है।

आप एक कक्षा में एक समारोह को परिभाषित कर रहे हैं, और आप केवल यह अपने आप के लिए उपलब्ध चाहते हैं, आप इसे इस तरह परिभाषित करेंगे:

private function foo($arg1, $arg2) { /*function stuff goes here */ } 

आप एक कक्षा में एक समारोह को परिभाषित कर रहे हैं कि आप वर्ग है जो इस वर्ग से विरासत के लिए उपलब्ध है, लेकिन उपलब्ध नहीं है सार्वजनिक रूप से इस तरह से हो सकता है, यह निश्चित हैं:

protected function foo($arg1, $arg2) 

मैं बहुत यकीन है कि PHP5 में डिफ़ॉल्ट रूप से, कार्य सार्वजनिक कर रहे हैं, जिसका अर्थ है तुम नहीं कर रहा हूँ निम्नलिखित वाक्यविन्यास का उपयोग करना है, लेकिन यह वैकल्पिक है:

public function foo($arg1, $arg2) { /*function stuff goes here */ } 

आपको सार्वजनिक फ़ंक्शन का उपयोग करने से पहले ऑब्जेक्ट को तुरंत चालू करना होगा। तो मैं बस पूरी तरह से हो जाएगा और आप जानते हैं कि आदेश एक वस्तु instantiating बिना एक कक्षा में एक समारोह का उपयोग करने के लिए, निम्न सिंटैक्स का उपयोग सुनिश्चित करें करते हैं:

static function foo($arg1, $arg2) { /*function stuff goes here */ } 

है कि आप द्वारा समारोह का उपयोग करने की अनुमति देगा केवल, वर्ग को संदर्भित इस प्रकार है:

MyClass::foo($a1, $a2); 

अन्यथा, आप निम्न कार्य करना होगा:

$myObject = new MyClass(); 
$myObject->foo($a1, $a2); 
+2

मुझे लगता है कि क्या ओ पी पूछ रहा था PHP में सी में 'friend' कीवर्ड को कुछ इसी तरह लागू करने के लिए कैसे था ++, यानी कुछ निजी/सुरक्षित डेटा/तरीकों कुछ वर्गों जो किया _to उपलब्ध बनाने इससे प्राप्त नहीं है I – Xenon

5

यह विशेषाधिकार उठाने के लिए भी संभव है उर्फ ​​डेटा चुनिंदा लीक , php> = 5.3.3 में एक हैंडशेक और बंद करने का उपयोग कर।

असल में, बातचीत चलती है: कक्षा ए में एक सार्वजनिक विधि है जो कक्षा बी ऑब्जेक्ट स्वीकार करती है, और इसे बंद करने के लिए बी-> अनुदान सहायता (या जो भी आपका इंटरफ़ेस परिभाषित करता है) को कॉल करता है। बंद use($that,$anythingelseyouneed) जहां $ = $ यह है, और कुछ भी आपको यह निर्धारित करने की आवश्यकता है कि किन संपत्तियों को एक्सेस करने की अनुमति है। बंद करने के लिए एक तर्क है - संपत्ति वापस करने के लिए; अगर यह $ पर एक संपत्ति है और सबकुछ शांत है, तो बंद संपत्ति संपत्ति लौटाती है।अन्यथा, यह '' देता है, या अपवाद फेंकता है, या शायद एक डिफ़ॉल्ट मान।

कक्षा बी-> अनुदान सहायता एक कॉल करने योग्य को स्वीकार करती है और इसे निजी संपत्तियों को बाहर निकालने के लिए अन्य विधियों में इसका उपयोग करके इसे बंद कर देती है। कक्षा बी के डिफ़ॉल्ट कन्स्ट्रक्टर निजी बनाओ। हैंडशेक होने के लिए क्लास ए तर्क लेते हुए एक स्थिर फैक्ट्री विधि का उपयोग करके बी का निर्माण करें।

यहाँ सार: https://gist.github.com/mcamiano/00592fb400e5043d8acd

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