2009-11-22 18 views
6

के किसी अन्य ऑब्जेक्ट की संरक्षित संपत्ति तक पहुंचने का तरीका क्या किसी ऑब्जेक्ट की विधि एक ही कक्षा के किसी अन्य ऑब्जेक्ट की संरक्षित संपत्ति तक पहुंचने में सक्षम होनी चाहिए?एक ही कक्षा

मैं PHP में कोडिंग कर रहा हूं, और मुझे अभी पता चला है कि एक ऑब्जेक्ट की संरक्षित संपत्ति को उसी वर्ग की विधि द्वारा एक्सेस किया जा सकता है, भले ही एक ही ऑब्जेक्ट न हो।

उदाहरण में, पहले, आपको आउटपुट में "3" मिलेगा - जैसा कि फ़ंक्शन पढ़ा जाता है। बाहरी यूज़र सफलतापूर्वक मूल्य तक पहुंच जाएगा - और उसके बाद एक PHP घातक त्रुटि उत्पन्न होगी - क्योंकि मुख्य प्रोग्राम विफल हो जाएगा एक ही मूल्य तक पहुंच।

<?php 

class user 
{ 
protected $property = 3; 

public function readOtherUser() 
{ 
    $otherUser = new user(); 
    print $otherUser->property; 
} 
} 

$user = new user(); 

$user->readOtherUser(); 
print $user->property; 

?>

इस एक PHP बग है या यह इच्छित व्यवहार है (और वहाँ तथ्य यह है के लिए संदर्भ) (और मैं इस अवधारणा ... :) दोबारा सीखने की ज़रूरत होगी)? यह अन्य प्रोग्रामिंग भाषाओं में कैसे किया जाता है?

धन्यवाद!

+1

एनबी। रुबी का ['निजी'] (http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html#s4) वर्णित व्यवहार करता है- एक अलग विधि पर एक निजी विधि नहीं कहा जा सकता है। – outis

उत्तर

6

इसका उद्देश्य है। एक ही कक्षा के निजी सदस्यों तक पहुंचना भी संभव है। तो संशोधक के बारे में सोचें कि क्लास वार संशोधक हों, न कि ऑब्जेक्टिव संशोधक।

PHP एकमात्र ऐसी भाषा नहीं है जिसमें यह सुविधा है। उदाहरण के लिए जावा भी यह है।

2

यह इरादा व्यवहार है। एक संरक्षित चर या फ़ंक्शन का अर्थ है कि इसे उसी वर्ग या किसी वर्ग द्वारा प्राप्त किया जा सकता है जो उस वर्ग से प्राप्त होता है। एक संरक्षित विधि केवल कक्षा के भीतर से ही बुलाया जा सकता है, उदा। आप इसे इस तरह से कॉल नहीं कर सकते:

$object = new MyClass(); 
$object->myProtectedFunction(); 

यह आपको एक त्रुटि देगा। हालांकि, परिभाषित वर्ग 'MyClass' के भीतर से, आप सुरक्षित फ़ंक्शन को पूरी तरह से कॉल कर सकते हैं।

वैरिएबल के लिए भी लागू होता है। संक्षेप में:

use PROTECTED on variables and functions when: 
1. outside-code SHOULD NOT access this property or function. 
2. extending classes SHOULD inherit this property or function. 
संबंधित मुद्दे