PHP Variable Scope – Access Specifiers – PHP में मूल रूप से कुल 6 Access Scope Specifier हैं, जिनमें से तीन के बारे में हम अभी जानेंगे और बचे हुए तीन के बारे में हम आगे जानेंगे।
Access Scope Specifier इस बात को Specify करते हैं कि किसी Object के किसी Data या Method को कब, कौन और किस हद तक Access कर सकता है।
public Access Specifier
जब हम किसी Class के Data Members को किसी भी अन्य Function द्वारा Directly Accessible रखना चाहते हैं, तब हम उस Data Member के साथ public Access Specifier का प्रयोग करते हैं। जैसेः
<?php class UserRegistration { public $name; public $email; public $confirm; } ?>
इस प्रकार के Data Members को कोई भी अन्य Function या PHP Code Directly Access कर सकता है। यानी हम निम्नानुसार Statement द्वारा $name, $email या $confirm Data Members को Value Set कर सकते हैं अथवा Display कर सकते हैं:
<?php $user = new UserRegistration; $user->name = "Ramesh Sharma"; $user->email = "rahul.sharma@gmail.com"; echo "Username: ". $user->name . "\n"; echo "Email: " . $user->email . "\n"; ?>
var Access Specifier
ये Access Specifier बिल्कुल public Access Specifier की तरह है, लेकिन ये Access Specifier PHP 4 में OOPS को सही तरीके से Implement करने के लिए Define किया गया था। इसलिए PHP 5 Version में इसे उपयोग में नहीं लेना चाहिए, क्योंकि सम्भवतया इसे PHP के अगले किसी Version में Permanently Remove कर दिया जाएगा।
private Access Specifier
ये Access Specifier बिल्कुल ही Object Oriented Programming System का मूल आधार है। इसी Access Specifier का प्रयोग करके हम ये तय करते हैं कि कोई User Object के केवल उन्हीं Member को Access कर सकता है, जिन्हे public रखा गया हो। जो Members private होते हैं, उन Members को Class के अन्दर Define किए गए Member Functions के अलावा कोई भी अन्य Function या Script Directly Access नहीं कर सकता।
परिणामस्वरूप Object के Data हमेंशा सुरक्षित रहते हैं। क्योंकि Object के Data को Access करने की क्षमता केवल समान Class में Define किए गए Methods के पास होती है और सामान्यतः Methods को public Scope में रखा जाता है।
फलस्वरूप Program के अन्य Functions या PHP Script, Object के केवल इन Public Scope वाले Methods को ही Access करने में सक्षम होते हैं और ये Methods, Data को Directly Access करने में सक्षम होते हैं। इसलिए Data के साथ जो भी प्रक्रिया करनी होती है, वे सभी प्रक्रियाऐं इन Public Scope वाले Methods में लिखी जाती हैं और जब भी कोई Function या Script Object के किसी Data Member के साथ किसी प्रकार की प्रक्रिया करना चाहता है, तो उसे इन Public Methods में से ही किसी Method को Call करना पडता है।
इसे समझने के लिए हम पिछले Program को ही नए तरीके से Modify कर रहे हैं, जो कि निम्नानुसार हैः
<?php class UserRegistration { //Properties private $name; private $email; private $confirm; } $user = new UserRegistration; $user->name = "Ramesh Sharma"; $user->email = "rahul.sharma@gmail.com"; echo $user->name . "\n"; echo $user->email . "\n"; ?>
इस Program में हमने Class के सभी Data Members के साथ private Keyword Specify करके सभी Data Members को Private बना दिया है। परिणामस्वरूप जब निम्न Statements द्वारा इस Object के Data Members को Access करने की कोशिश करते हैं:
$user->name = "Ramesh Sharma"; $user->email = "rahul.sharma@gmail.com"; echo $user->name . "\n"; echo $user->email . "\n";
तो PHP हमें निम्न Error देता हैः
PHP Fatal error: Cannot access private property UserRegistration::$name in C:\wamp\www\phpInHindi\001.php on line 11 PHP Stack trace: PHP 1. {main}() C:\wamp\www\phpInHindi\001.php:0 Fatal error: Cannot access private property UserRegistration::$name in C:\wamp\www\phpInHindi\001.php on line 11 Call Stack: 0.0078 326928 1. {main}() C:\wamp\www\phpInHindi\001.php:0
ये Error इसीलिए Display हो रहा है क्योंकि Class के सभी Data Members Private हैं, जिन्हें Class के Member Functions के अलावा कोई भी Directly Access नहीं कर सकता, जबकि हम इन्हें Script द्वारा Directly Access करने की कोशिश कर रहे हैं।
चूंकि उपरोक्त Program में Class के Data private हैं, इसलिए इस Class के Data को Access व Manipulate करने के लिए हमें इस Program को निम्नानुसार Modify करना होगाः
<?php class UserRegistration { //Properties private $name; private $email; private $confirm; //Methods public function setData($name, $email){ $this->name = $name; $this->email = $email; } public function display(){ echo "Username: ". $this->name . "\n"; echo "Email: " . $this->email . "\n"; } } $user = new UserRegistration; $user->setData('Kuldeep Mishra', 'bccfalna@gmail.com'); $user->display(); ?>
इस Program में हमने UserRegistration Class में setData() व display() नाम के दो public Methods Create किए हैं। चूंकि हमने इन Methods को Public Scope में रखा है, इसलिए इन Methods को हम किसी भी दूसरे Function अथवा Class से बाहर की Script में Call कर सकते हैं।
जब हमें किसी UserRegistration Type के Object का नाम व ईमेल एडरस Input करना होता है, तब हम उस Object के लिए setData() Method को Call करते हैं और Arguments के रूप में Name व Email Address Pass करते हैं। परिणामस्वरूप setData() Method Object के Name व Email Address को Set कर देता है।
इसी तरह से जब हमें Object के Data को Display करना होता है, तब हम Object के साथ display() Method को Call करते हैं और Object के Private Data को Display करने का काम display() Method करता है।
Class के Private Data को कोई भी Function या Script Directly Access नहीं कर सकता, क्योंकि Class का Private Data, Class से बाहर Accessible नहीं होता। यानी Class का Data Class के Scope से बाहर Invisible या Hidden रहता है, जो कि Object Oriented Programming का मूल Concept है।
इस Modified Program में हमने एक नए $this Keyword का प्रयोग किया है। ये Keyword किसी भी Object को उसके Calling Function में Refer करता है। यानी जब हम किसी Object के साथ किसी Method को Call करते हैं, तो उस Called Method में Caller Object को $this द्वारा Represent किया जाता है।
चूंकि PHP Variables को Declare करने का कोई Specific Place नहीं होता और हम जहां पर किसी नए नाम को $ Sign के साथ Specify कर देते हैं, वहीं पर नया Object Create हो जाता है, इसलिए हम किसी Class में बिना किसी Data Member को Declare किए हुए भी उसमें जब चाहें तब नया Data Member Create करके Class को Extend कर सकते हैं। इस Concept को समझने के लिए हम उपरोक्त Program को निम्नानुसार भी Redesign कर सकते हैं:
<?php class UserRegistration { public function setData($name, $email){ $this->name = $name; $this->email = $email; } public function display(){ echo "Username: ". $this->name . "\n"; echo "Email: " . $this->email . "\n"; } } $user = new UserRegistration; $user->setData('Kuldeep Mishra', 'bccfalna@gmail.com'); $user->display(); ?>
ये Modified Program भी Exactly वैसा ही काम करता है, जैसा पिछला Program कर रहा है। क्योंकि जब setData() Method Call किया जाता है, तब $this->name व $this->email Data Members Automatically उस Object के लिए Create हो जाते हैं, जिस Object के साथ setData() Method को Call किया जाता है।
जिस तरह से हम Data Members के साथ Access Specifies का प्रयोग कर सकते हैं उसी तरह से हम किसी Function के साथ भी इनका प्रयोग कर सकते हैं।
जब हम किसी Function के साथ किसी Access Specifier का प्रयोग नहीं करते अथवा public Access Specify का प्रयोग करते हैं, तब वह Function Class से बाहर Publically Available रहता है, जिसे कोई भी अन्य Function या Script Directly Access कर सकता है।
लेकिन जब हम किसी Function के साथ private Access Specifier का प्रयोग करते हैं, तब उस Function को केवल Class के अन्दर Specify किए गए अन्य Methods ही Directly Access कर सकते हैं। यानी Private Data Members की तरह ही Private Member Functions भी Class से बाहर Directly Available नहीं रहते।
PHP में हम किसी भी Public Function को Class के नाम व Scope Resolution Operator का प्रयोग करके Directly Class से बाहर Access कर सकते हैं। लेकिन जब हम ऐसा करते हैं, तब हमें इस बात का ध्यान रखना जरूरी होता है कि हम जिस Member Function को Call के बाहर Directly Call कर रहे हैं, उस Function में $this का प्रयोग न किया गया हो।
क्योंकि $this केवल Object के लिए ही Specify किया जा सकता है और जब किसी Member Function में $this का प्रयोग किया गया होता है, तब PHP $this के लिए किसी Object को Search करता है।
इस स्थिति में यदि किसी Member Function को Directly Class से बाहर Call किया गया हो, जिसके साथ कोई Object Associated न हो, तो PHP Error Generate करता है।
<?php class Visitors { public function greetVisitor() { echo "\n Hello"; } function sayGoodbye() { echo "\n Goodbye"; } } Visitors::greetVisitor(); $visitor = new Visitors(); $visitor->sayGoodbye(); ?>
इस Program में हमने greetVisistor() Method को Standalone Function की तरह व Object के Method की तरह यानी दोनों ही तरीकों से Call किया है और ये Function दोनों ही तरीकों से सही प्रकार से काम करता है, क्योंकि Function को करने के लिए कुछ खास नहीं है। लेकिन यदि हम उपरोक्त Program को निम्नानुसार थोडा सा Modify कर दें:
<?php class Visitors { public function greetVisitor($name) { $this->name = $name; echo "\n Hello" . $name; } function sayGoodbye() { echo "\n Goodbye"; } } Visitors::greetVisitor('Kuldeep'); $visitor = new Visitors(); $visitor->sayGoodbye(); ?>
तो अब greetVisistor() Function को Standalone Function की तरह Call करने पर निम्नानुसार Error Trigger होता हैः
PHP Fatal error: Using $this when not in object context in C:\wamp\www\phpInHindi\001.php on line 6 PHP Stack trace: PHP 1. {main}() C:\wamp\www\phpInHindi\001.php:0 PHP 2. Visitors::greetVisitor() C:\wamp\www\phpInHindi\001.php:16 Fatal error: Using $this when not in object context in C:\wamp\www\phpInHindi\001.php on line 6 Call Stack: 0.0008 328144 1. {main}() C:\wamp\www\phpInHindi\001.php:0 0.0008 328368 2. Visitors::greetVisitor() C:\wamp\www\phpInHindi\001.php:16
क्योंकि इस बार greetVisitor() Method में Current Object यानी इस Method को Call करने वाले Object में $name नाम के एक Data Member को Argument के रूप में आने वाला नाम Set किया गया है और Current Object को Refer करने के लिए $this का प्रयोग किया गया है। इसलिए जब इस Method को Standalone Function की तरह Call किया जाता है, तब PHP $this Object यानी Function को Call करने वाले Object को Search करता है।
चूंकि Function को Standalone Function की तरह Call किया गया है, इसलिए $this किसी भी Object को Refer करने में सक्षम नहीं होता। परिणामस्वरूप Output में Error Trigger होता है।
Initializing Data Members
PHP में जब हम कोई Class Crete करते हैं, तो उस Class के Data Members को प्रारम्भिक मानों से Initialize भी कर सकते हैं। Data Members को Initialize करने के लिए हम सामान्य Initializing Statements का तो प्रयोग कर सकते हैं, लेकिन हम किसी Calculation से Dynamically Generate होने वाले Result को किसी Variable में Initialize नहीं कर सकते। यानी हम निम्नानुसार Statements नहीं लिख सकतेः
$value1 = 10; $value2 = 30; $mul = $value1 * $value2;
उपरोक्त Code में तीसरी Line में $value1 व $value2 Variables में Stored मानों का गुणा होने के बाद Dynamically Generate होने वाला Result $mul नाम के Variable में Initialize हो रहा है। PHP इस प्रकार के Initialization को Support नहीं करता।
Scope Resolution Operator ( :: )
Scope Resolution Operator ( :: ) C++ से लिया गया Operator है। ये Operator एक प्रकार का Token है। इस Operator का प्रयोग Static व Constant Data Members को Class से बाहर Access करने के लिए तथा किसी Class की Properties व Methods को Override करने के लिए किया जाता है। ये Operator एक प्रकार से Class व उसके Class Level Members के बीच Connector का काम करता है।
Constant Data Members
जिस तरह से Global Scope में किसी Constant को Define करने के लिए हम define() Function को Use करते हैं, उसी तरह से हम किसी Class के Data Members को भी Constant Define कर सकते हैं।
जब हम किसी Class में किसी Data Member को Constant Declare करना चाहते हैं, तब हमें const Keyword का प्रयोग करना होता है। जैसेः
class MathCalculation { const PI = 3.1415; } echo "Circle Area : " . 2 * MathCalculation::PI * 10 ;
जब हम किसी Class में किसी Data Member को Constant की तरह Define करते हैं, तब Constant को Define करते समय ही हमें उस Constant का मान भी Specify करना जरूरी होता है। साथ ही किसी Class में Specify किए गए Constant को हम Class के बाहर भी Access कर सकते हैं, क्योंकि एक Constant Data Member के साथ हमें किसी Access Specifier को Specify नहीं करना होता।
Constant Data Member को Class से बाहर Access करने के लिए हमें Class के नाम के साथ Scope Resolution Operator यानी :: Operator का प्रयोग करने के बाद Constant का नाम Specify करना होता है। जैसाकि हमने उपरोक्त Code की अन्तिम Line में किया है।
Constants को हमेंशा Uppercase Letters में ही Specify करना चाहिए। ऐसा करने से हम Variables व Constants को आसानी से Identify कर पाते हैं।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook PHP in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
PHP in Hindi | Page: 647 | Format: PDF