
PHP call_user_func – call_user_func_array – Callback Function – क्योंकि जब हम PHP को Object Oriented तरीके से उपयोग में लेते हैं, तब Functions अपना बहुत ही महत्वपूर्ण Role Play करते हैं, क्योंकि Functions ही किसी भी Object की Functionalities यानी Behavior को Specify करते हैं। इसलिए PHP के Functions को अच्छी तरह से समझना व उन्हें उपयोग में लेने के बारे में बेहतर तरीके से जानना बहुत ही जरूरी है।
PHP में Functions को बेहतर तरीके से Handle करने के लिए भी कुछ Predefined Functions दिए गए हैं। इन Special Functions में से कुछ Functions को हम पहले ही देख चुके हैं। बाकी के Functions के बारे में भी समझ लेना हमारे लिए काफी उपयोगी रहेगा।
Callback Functions
PHP में कुछ Functions ऐसे हैं, जो Callback Functions के रूप में किसी Built-In या User Defined Function को किसी दूसरे Function में Argument के रूप में Accept करते हैं।
उदाहरण के लिए call_user_func() या usort() Functions Parameter के रूप में किसी User Defined Function को Accept करते हैं। Callback Function Simple Function भी हो सकते हैं और Complex Functions भी हो सकते हैं।
जब हम किसी Function में किसी Callback Function को Specify करते हैं, तब हमें Callback Function के नाम को एक String के रूप में Parameter की तरह उस Function में Pass करना होता है, जो Callback Function Accept करता है।
यानी हम सभी Functions में Parameter के रूप में Callback Functions Pass नहीं कर सकते बल्कि कुछ Function ऐसे होते हैं, जो Callback Functions को Parameter के रूप में Accept करते हैं और हम केवल उन्हीं Functions में Callback Functions को Specify कर सकते हैं। usort व call_user_func() इसी प्रकार के Functions के उदाहरण हैं।
हालांकि हम हमारे स्वयं के भी ऐसे Functions Create कर सकते हैं, जो कि Parameter के रूप में Callback Function Accept करते हों, लेकिन ऐसे Functions Create करना, पूरी तरह से हमारी जरूरत पर निर्भर करता है।
PHP के जो Functions, Callback Functions को Parameter के रूप में Accept करते हैं, उन Functions में हम किसी भी Built-In या User Defined Function को Parameter के रूप में Specify कर सकते हैं, लेकिन Callback Functions के रूप में हम किसी Language Constructs जैसे कि array(), echo(), empty, eval(), exit(), isset(), list(), print() या unset() Statements को Pass नहीं कर सकते।
जब हम Callback Parameter के रूप में किसी Class के Object के Method को Pass करना चाहते हैं, तब उस Object को एक Array के रूप में Pass करना होता है, जिसके Index Number 0 पर Object होता है और Index Number 1 पर उस Object के उस Method का नाम होता है, जिसे हम Parameter के रूप में Callback Function की तरह Specify करना चाहते हैं।
हम किसी Callback Parameter की तरह बिना किसी Class का Object Create किए हुए सीधे ही Class के Method को भी Specify कर सकते हैं, लेकिन उस स्थिति में भी हमें एक Array Create करना होता है, जिसके Index Number 0 पर Class का नाम तथा Index Number 1 पर उस Class के उस Method का नाम होता है, जिसे हम Callback Function की तरह Specify करना चाहते हैं।
User Defined Functions के अलावा हम create_function() Function का प्रयोग करके कोई Anonymous Function भी Create कर सकते हैं और उस Anonymous Function को भी Callback Function की तरह Parameter के रूप में Specify कर सकते हैं।
PHP 5.3.0 में हम किसी Closure को भी Callback Parameter की तरह Specify कर सकते हैं।
call_user_func() Function
ये एक Special Function है, जो किसी दूसरे Function को Call करने का काम करता है। इस Function का Syntax निम्नानुसार होता हैः
mixed call_user_func (callback $callback, mixed $parameter, mixed $… )
ये Function Variable Number of Arguments Accept करता है, लेकिन इस Function के पहले Argument के रूप में हमें उस Function का नाम Specify करना होता है, जिसे हम Call करना चाहते हैं और बाकी के सभी Arguments इस Call होने वाले Function के Parameter की तरह उपयोग में लिए जाते हैं।
यानी पहला Parameter एक प्रकार का Callback Function है, जिसे call_user_func() Function Call करेगा और इस Callback Function के Arguments के रूप में हम जिन Parameters को Pass किया जाना होता है, उन्हें इस Function के अन्य Parameters की तरह Specify करते हैं।
ये Function वह Value Return करता है, जो Callback Function Return करता है जबकि यदि Callback Function किसी तरह की कोई Value Return न करे, तो ये Function भी कोई Value Return नहीं करता। जबकि यदि ये Function ठीक तरह से Execute न हो सके तो Error की स्थिति में ये Function False Return करता है।
जब हम call_user_func() को Use करते हैं, तब मूल रूप से ध्यान रखने वाली एक बात ये होती है कि हम इस Function में किसी भी Parameter को By Reference Pass नहीं कर सकते। इस Function को बेहतर तरीके से उपयोग में लेना सीखने के लिए हम निम्नानुसार एक उदाहरण Program Create कर सकते हैं:
<?php function increment(&$var){ $var++; } Echo "Normal Function Call. \n"; $a = 0; for($i=0; $i<3; $i++){ increment($a); echo $a."\n"; } Echo "Function Call through call_user_func() Function. \n"; $a = 0; for($i=0; $i<3; $i++){ call_user_func('increment', $a); echo $a."\n"; } ?> //Output Normal Function Call. 1 2 3 Function Call through call_user_func() Function. Warning: Parameter 1 to increment() expected to be a reference, value given in C:\ wamp\www\phpInHindi\001.php on line 18 0 Warning: Parameter 1 to increment() expected to be a reference, value given in C:\ wamp\www\phpInHindi\001.php on line 18 0 Warning: Parameter 1 to increment() expected to be a reference, value given in C:\ wamp\www\phpInHindi\001.php on line 18 0
इस Program में हमने increment() नाम का एक User Defined Function Create किया है, जो Parameter के रूप में किसी Variable का Reference Accept करता है। फिर इस Function को हमने दो तरीकों से दो Loops द्वारा तीन बार Call किया है।
उपरोक्त Program में हम देख सकते हैं कि जिस तरह से हम किसी Function को Normal तरीके से Call करते हैं, उसी तरह से किसी Function को हम call_user_func() Function द्वारा भी Call कर सकते हैं। लेकिन इस Function को Use करके किसी Function को Call करते समय हम उस Function में Argument के रूप में किसी Reference को Specify नहीं कर सकते।
जबकि यदि किसी Function को Parameter के रूप में Reference की जरूरत हो तो उस Function को call_user_func() में Callback Function की तरह Specify करके Call नहीं किया जा सकता। इस प्रक्रिया को समझने के लिए हम उपरोक्त Program के Output को समझने की कोशिश करते हैं।
जब हम इस Function को Normal तरीके से Call करते हैं, तो ये Function अपने Reference Variable के मान को Normal तरीके से Continuously Increment करता है। लेकिन जब हम इस Function को call_user_func() Function के माध्यम से Call करते हैं, तो PHP हमें एक Warning Message देता है कि हमें Argument के रूप में किसी Variable का Reference Pass करना चाहिए।
अब यदि हम इस Program से सही Output प्राप्त करने के लिए हम call_user_func() Function के दूसरे Argument के रूप में Variable के Reference को Specify करने हेतु उपरोक्त Program को निम्नानुसार Modify करें:
Echo "Function Call through call_user_func() Function. \n"; $a = 0; for($i=0; $i<3; $i++){ call_user_func('increment', &$a); echo $a."\n"; }
तो अब हमारा Program Run ही नहीं होता और हमें निम्नानुसार Fatal Error Message प्राप्त होता हैः
//Output Fatal error: Call-time pass-by-reference has been removed in C:\wamp\www\ phpInHindi\001.php on line 18
ये Error इसलिए प्राप्त होता है, क्योंकि हम call_user_func() Function में किसी Parameter को By Reference Specify नहीं कर सकते। यानी हम उपरोक्त Program में call_user_func() का प्रयोग करके वह Normal Output प्राप्त नहीं कर सकते, जो कि होना चाहिए। इसीलिए PHP इसी Function का एक और Alternative Function call_user_func_array() Provide किया गया है।
call_user_func_array() Function
ये Function भी पिछले Function की तरह किसी User Defined या Built-In Function को अलग तरीके से Call करने की सुविधा देता है।
इस Function और call_user_func() Function दोनों में मूल अन्तर केवल इतना है कि call_user_func() में Callback Function में Pass किए जाने वाले सभी Parameters को हमें call_user_func() Function के Parameters के रूप में Specify करना पडता है। जबकि उन्हीं Parameters को call_user_func_array() Function में एक Array के रूप में Specify करना पडता है।
इस मूल अन्तर के अलावा इन दोनों Functions के काम करने के तरीके अथवा Value Return करने के तरीके में कोई अन्तर नहीं है और दोनों ही Functions लगभग एक ही तरीके से काम करते हैं। इसलिए यदि हम पिछले Program को ही इस Function द्वारा Modify करें, तो हमारा Modified Program निम्नानुसार होगाः
<?php function increment(&$var) { $var++; } Echo "Normal Function Call. \n"; $a = 0; for($i=0; $i<5; $i++){ increment($a); echo $a."\n"; } Echo "\nFunction Call through call_user_func_array() Function. \n"; $a = 0; for($i=0; $i<5; $i++){ call_user_func_array('increment', array(&$a)); echo $a."\n"; } ?> //Output Normal Function Call. 1 2 3 Function Call through call_user_func_array() Function. 1 2 3
हम Output देखकर समझ सकते हैं कि अब ये Program बिल्कुल वही Output दे रहा है जो कि Function को Normal तरीके से Call करने पर प्राप्त होता है।
इसका कारण ये है कि call_user_func_array() Function में Callback Function के सभी Parameters को एक Array में Pass किया जाता है, इसलिए हम Parameters को By Reference भी Pass कर सकते हैं।
परिणामस्वरूप हम इस Function को Use करके किसी भी अन्य Function को Exactly Normal Function की तरह Call कर सकते हैं।
चूंकि call_user_func() व call_user_func_array() दोनों ही Functions लगभग एक दूसरे के Alternative हैं, इसलिए हम इन दोनों Functions को एक ही प्रकार का काम करने के लिए Use कर सकते हैं।
जैसाकि हमने पहले भी कहा कि हम किसी Class के Method को भी इन Functions में Callback Function के रूप में Specify कर सकते हैं। यदि हम किसी Class के किसी Object के Method को Callback Function की तरह इन Functions में Specify करना चाहें, तो हमें इन Functions को निम्न Program के अनुसार Call करना होता है, जहां Callback Function के रूप में हमें एक Array Pass करना होता है, जिसका पहला Element Object का नाम व दूसरा Element Object के Method का नाम होता हैः
<?php class Time{ private $hour, $minutes; public function input($hour=12, $minutes=0){ $this->hour = $hour; $this->minutes = $minutes; } public function __toString(){ return $this->hour . ':' . $this->minutes; } } $now = new Time; Echo " Class Method Call through call_user_func() Function.\n"; call_user_func(array($now, "input"), 10, "15"); Echo "Time : " . $now ."\n\n"; Echo " Class Method Call through call_user_func_array() Function.\n"; call_user_func_array(array($now, "input"), array("10", "15")); Echo "Time : " . $now ."\n"; ?> //Output Class Method Call through call_user_func() Function. Time : 10:15 Class Method Call through call_user_func_array() Function. Time : 10:15
जिस तरह से हम किसी Class के Object को इन Functions में Specify करके उन Object के Methods को Callback Functions की तरह Use करते हैं, उसी तरह से हम किसी Class के Methods को Directly Class का नाम Specify करके भी Callback Functions की तरह Call कर सकते हैं, जैसाकि निम्न Program में किया गया हैः
<?php class HelloMister{ public function hello($name){ Echo "Hello! $name \n\n"; } } Echo "Class Method Call through call_user_func() Function.\n"; call_user_func(array('HelloMister', "hello"), "Krishna."); Echo " Class Method Call through call_user_func_array() Function.\n"; call_user_func_array(array('HelloMister', "hello"), array("Govinda")); ?> //Output Class Method Call through call_user_func() Function. Hello! Krishna. Class Method Call through call_user_func_array() Function. Hello! Govinda
उपरोक्त तरीकों के अलावा हम किसी Anonymous Function को भी इन Functions में Callback Function के रूप में Specify करके Call कर सकते हैं। जैसेः
<?php Echo "Anonymous Function Call through call_user_func() Function.\n"; call_user_func(function ($name){ Echo "Hello! $name \n\n"; }, "Krishna."); Echo "Anonymous Function Call through call_user_func_array() Function.\n"; call_user_func_array(function ($name){ Echo "Hello! $name \n\n"; }, array("Govinda")); ?> //Output Anonymous Function Call through call_user_func() Function. Hello! Krishna. Anonymous Function Call through call_user_func_array() Function. Hello! Govinda
जैसाकि हम देख सकते हैं कि इस Program का Output और पिछले Program का Output Exactly एक जैसा ही है। अन्तर केवल इतना है कि इस Program में हमने एक Anonymous Function को Callback Function की तरह Specify किया है जबकि पिछले Program में हमने एक Class के Method को Callback Function की तरह Specify किया था।
जब हम call_user_func() अथवा call_user_func_array() जैसे Functions का प्रयोग करके किसी Function को Call करते हैं और यदि Callback Function में कोई Uncaught Exception हो, तो ये Functions Execute नहीं होते। इसलिए यदि किसी Program में ये Functions Callback Function को ठीक से Call न कर रहे हों, तो Callback Functions को Exceptions व Errors के लिए Check करना चाहिए।
forward_static_call() and forward_static_call_array() Functions
forward_static_call() Function Exactly call_user_func() Function की तरह तथा forward_static_call_array() Function Exactly call_user_func_array() Function की तरह काम करते हैं। इनमें Pass किए जाने वाले Parameters व इन Functions से Return होने वाली Return Value भी Exactly समान ही होते हैं।
हम जितने तरीकों से call_user_func() व call_user_func_array() Functions को Call कर सकते हैं, उन सभी तरीकों से इन Functions को भी Call कर सकते हैं। अन्तर केवल इतना है कि ये Functions किसी Class के Static Methods अथवा किसी Static User Defined Function को Call करने के लिए Use किए जाते हैं।
get_defined_functions() Function
ये Function किसी तरह का कोई Parameter Accept नहीं करता लेकिन Current Script में Available सभी Built-In Functions व User Defined Functions की List को एक Multidimensional Array के रूप में Return करता है। इस Function को हम निम्नानुसार उपयोग में ले सकते हैं:
<?php print_r(get_defined_functions()); ?>
PHP 5.4.3 Version में कुल 1007 Pre-defined Functions Available हैं, जिनकी संख्या आने वाले हर नए PHP Versions के साथ बढती रहती है।
PHP के Built In Functions को Use करने के लिए हमें इस Function से Return होने वाले Multi-Dimensional Array के Variable के साथ निम्नानुसार Access करना होता हैः
$multiArray = get_defined_functions();
$multiArray[‘internal‘][x]
जबकि User Defined Functions को इस Function द्वारा Return होने वाले Array से Access करने के लिए हमें निम्नानुसार Statements का प्रयोग करना होता हैः
$multiArray = get_defined_functions();
$multiArray[‘user‘][x]
retister_shutdown_function() Function
ये एक बहुत ही उपयोगी Function है। इस Function का प्रयोग करके हम ऐसे Callback Function को Execution के लिए Specify कर सकते हैं, जो कि किसी PHP Script के Execution के अन्तिम Function के रूप में Call होता है।
इस Function में Specify किया गया Callback Function Script में Create किए गए किसी भी Object के Destroy होने से पहले Execute होता है।
यानी Script के सभी Statements के Execute होने के बाद जब Script अपना Execution समाप्त करने के लिए विभिन्न प्रकार के Destruction Methods को Execute करना शुरू करता है, उससे Just पहले इस Function में Specified Callback Function Execute हो जाता है।
हम इस Function द्वारा एक से ज्यादा Shutdown Functions को Register कर सकते हैं। हम जितने भी Shutdown Functions को Register करते हैं, वे सभी उसी क्रम में Script के अन्त के समय Execute होते हैं, जिस क्रम में हम उन्हें Specify करते हैं।
सामान्यतः हम इस Function में उन Shutdown Functions को Specify कर सकते हैं, जो कि किसी Database से Create किए गए Connection को Close करने अथवा Operating System में Open की गई File को Close करने का काम करते हैं।
यदि हम किसी भी Shutdown Function में exit() Statement का प्रयोग करते हैं, तो उस Shutdown Function के Execute होते ही Script Terminate हो जाती है।
उदाहरण के लिए यदि किसी Script में चार Shutdown Functions हों और हम दूसरे Shutdown Function में exit() Statement का प्रयोग करें, तो तीसरा व चौथा Shutdown Function Execute नहीं होता क्योंकि दूसरे Shutdown Function में exit() Statement के मिलते ही पूरा Script Terminate हो जाता है।
ये Function किसी तरह का कोई मान Return नहीं करता और यदि इस Function के पहले Argument के रूप में Register किया गया Shutdown Callback Function Callable न हो, तो ये Function एक E_WARNING Level Error Return करता है।
<?php function shutdown() { // This is our shutdown function, in // here we can do any last operations // before the script is complete. echo 'I am the last executable line.', PHP_EOL; } register_shutdown_function('shutdown'); ?> //Output I am the last executable line
इस Function के Call होने की प्रक्रिया को हम उपरोक्त उदाहरण द्वारा समझ सकते हैं। इस Function में भी call_user_func() Function की तरह Callback Function को पहले Argument के रूप में Specify करते हैं जबकि अन्य Arguments के रूप में Specified मान Callback Function के Parameter की तरह Use होते हैं।
साथ ही हमने call_user_func() Function में जितने तरह के Callback Function को Specify किया था, उन सभी तरह से हम इस Function में भी Callback Function को Specify कर सकते हैं।
यानी हम किसी Class के Method अथवा Object के Method अथवा Anonymous Function को भी ठीक उसी तरह से इस Function में Callback Function के रूप में Specify कर सकते हैं, जिस तरह से इन्हें call_user_func() Function के Callback Function के रूप में Specify किया था।
चूंकि ये Function Script के अन्त होते समय Execute होता है, इसलिए ये Function किसी तरह का कोई मान Return नहीं करता।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook PHP in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
PHP in Hindi | Page: 647 | Format: PDF