परिचय
PHP में एक फ़ंक्शन को कॉलिंग वातावरण/स्क्रिप्ट से आर्गुमेंट्स के रूप में इनपुट स्वीकार करने के लिए परिभाषित किया जा सकता है। ये आर्गुमेंट्स फ़ंक्शन के नाम के सामने पैरेंथेसिस के अंदर अल्पविराम से अलग सूची के रूप में दिए जाते हैं। ध्यान दें कि फ़ंक्शन कॉल करते समय, समान संख्या में आर्गुमेंट्स पास किए जाने चाहिए।
PHP मान द्वारा पासिंग, रेफरेंस द्वारा पासिंग, डिफ़ॉल्ट मान वाले आर्गुमेंट्स और वेरिएबल संख्या में आर्गुमेंट्स पास करके फ़ंक्शन कॉल करने का समर्थन करता है।
आर्गुमेंट्स के साथ फ़ंक्शन
उदाहरण 1: मान द्वारा पासिंग (Pass by Value)
निम्न उदाहरण में, एक फ़ंक्शन दो औपचारिक आर्गुमेंट्स के साथ परिभाषित है। जब इस फ़ंक्शन को मान द्वारा आर्गुमेंट्स पास करके कॉल किया जाता है। फ़ंक्शन के आर्गुमेंट्स इसके स्थानीय वेरिएबल्स बन जाते हैं। इसलिए, फ़ंक्शन के अंदर आर्गुमेंट के मान में कोई भी परिवर्तन इसके बाहर प्रतिबिंबित नहीं होता।
यहां, फ़ंक्शन के अंदर $x का मान बदल जाता है, लेकिन यदि हम फ़ंक्शन कॉल के बाद इसका मान जांचते हैं, तो यह नहीं बदला है।
<?php
function add($x, $y) {
$x = $x + $y;
echo $x . "\n";
}
$x = 10;
$y = 20;
add($x, $y);
// फ़ंक्शन के बाहर $x का पिछला मान है।
echo $x;
?>
आउटपुट
30 10
उदाहरण 2: फ़ंक्शन में सरणी पास करना
<?php
function add($arr) {
$sum = 0;
foreach ($arr as $i) {
$sum += $i;
}
echo "sum = " . $sum;
}
add(array(1, 2, 3));
?>
आउटपुट
sum = 6
रेफरेंस द्वारा आर्गुमेंट्स पास करना
मान फ़ंक्शन के आर्गुमेंट्स को मान द्वारा पास किए जाते हैं। इसलिए, फ़ंक्शन के अंदर आर्गुमेंट के मान में परिवर्तन इसके बाहर प्रतिबिंबित नहीं होते। जब आर्गुमेंट्स रेफरेंस द्वारा पास किए जाते हैं, तो परिवर्तन आर्गुमेंट के मान तक बाहर भी पहुंचते हैं।
रेफरेंस द्वारा मान प्राप्त करने के लिए, आर्गुमेंट के नाम को & सिंबल से उपसर्गित किया जाना चाहिए।
उदाहरण 3: रेफरेंस द्वारा पासिंग (Pass by Reference)
<?php
function swap(&$x, &$y) {
$t = $x;
$x = $y;
$y = $t;
echo "inside function x=$x y=$y\n";
}
$x = 5;
$y = 7;
echo "before calling function x=$x y=$y\n";
swap($x, $y);
echo "after calling function x=$x y=$y\n";
?>
आउटपुट
before calling function x=5 y=7 inside function x=7 y=5 after calling function x=7 y=5
swap() फ़ंक्शन में $x और $y वेरिएबल्स के मान अदला-बदली किए जाते हैं। चूंकि वेरिएबल्स रेफरेंस द्वारा पास किए जाते हैं, फ़ंक्शन के बाहर भी वेरिएबल्स संशोधित मान दिखाते हैं।
उदाहरण 4: सरणी तत्वों के रूप में रेफरेंस
निम्न उदाहरण में, सरणी तत्व व्यक्तिगत वेरिएबल्स के रेफरेंस हैं जो सरणी आरंभीकरण से पहले घोषित किए गए थे। यदि तत्व संशोधित होता है, तो वेरिएबल का मान भी बदल जाता है।
<?php
$a = 10;
$b = 20;
$c = 30;
$arr = array(&$a, &$b, &$c);
for ($i = 0; $i < 3; $i++)
$arr[$i]++;
echo "$a $b $c";
?>
आउटपुट
11 21 31
उदाहरण 5: फ़ंक्शन को रेफरेंस द्वारा सरणी पास करना
<?php
function arrfunction(&$arr) {
for ($i = 0; $i < 5; $i++)
$arr[$i] = $arr[$i] + 10;
}
$arr = [1, 2, 3, 4, 5];
arrfunction($arr);
foreach ($arr as $i) echo $i . " ";
?>
आउटपुट
11 12 13 14 15
उदाहरण 6: ऑब्जेक्ट और रेफरेंस
PHP में, ऑब्जेक्ट्स डिफ़ॉल्ट रूप से रेफरेंस द्वारा पास किए जाते हैं। जब ऑब्जेक्ट का रेफरेंस बनाया जाता है, तो इसका रेफरेंस $this के रूप में आर्गुमेंट के रूप में भी भेजा जाता है जो पहले ऑब्जेक्ट का रेफरेंस भी होता है।
<?php
class test1 {
private $name;
function getname() {
return $this->name;
}
function setname($name) {
$this->name = $name;
}
}
$obj1 = new test1();
$obj2 = &$obj1;
$obj1->setname("Amar");
echo "name: " . $obj2->getname();
?>
आउटपुट
name: Amar
टाइप हिंट्स (Type Declarations)
PHP वास्तव में एक डायनामिकली टाइप्ड भाषा है। इसलिए, वेरिएबल को उसके प्रकार के साथ घोषित करना आवश्यक नहीं है (जैसा कि C/C++ या Java में)। हालांकि, फ़ंक्शन में आर्गुमेंट्स की टाइप डिक्लेरेशन पार्सर को फ़ंक्शन को पास किए गए गलत डेटा प्रकारों का पता लगाने की अनुमति देती है।
सिंटैक्स
// टाइप हिंट्स के साथ फ़ंक्शन परिभाषित करें
function myfunction(type $arg1, type $arg2) {
..
..
}
फ़ंक्शन घोषणा में टाइप हिंट्स प्रदान करने के लिए सभी मानक PHP डेटा प्रकार जिनमें स्केलर प्रकार, सरणी, क्लास/इंटरफ़ेस, इटरेबल और ऑब्जेक्ट शामिल हैं, वैध प्रकार हैं।
उदाहरण 7: वेरिएबल आर्गुमेंट्स के साथ टाइप हिंट (मूल उदाहरण में त्रुटि सुधार)
<?php
function add(int ...$numbers) {
$ttl = 0;
foreach ($numbers as $num) {
$ttl = $ttl + $num;
}
return $ttl;
}
$total = add(10, 15, 20);
echo "total= $total\n";
echo "total=" . add(1, 2, 3, 4, 5) . "\n";
?>
आउटपुट
total= 45 total=15
उदाहरण 8: int टाइप हिंट के साथ सख्त प्रकार जांच
<?php
function add(int $x, int $y) {
$z = $x + $y;
echo "addition=$z\n";
}
add(10, 20);
add(5.55, 6.66);
?>
आउटपुट
addition=30 addition=11
ध्यान दें कि add() फ़ंक्शन के दूसरे कॉल में, फ्लोट्स को आर्गुमेंट्स के रूप में दिया गया है, लेकिन फिर भी कोई त्रुटि/चेतावनी प्रदर्शित नहीं होती। ऐसा इसलिए है क्योंकि PHP आंतरिक रूप से जोड़ करने के लिए फ्लोट को पूर्णांक में बलपूर्वक परिवर्तित करता है। ऐसे स्वचालित प्रकार रूपांतरण को रोकने के लिए, declare कंस्ट्रक्ट के साथ strict_types=1 का उपयोग करें।
उदाहरण 9: strict_types=1 के साथ सख्त टाइप हिंट
<?php
declare(strict_types = 1);
function add(int $x, int $y) {
$z = $x + $y;
echo "addition=$z\n";
}
add(10, 20);
add(5.55, 6.66);
?>
add() फ़ंक्शन का दूसरा कॉल अब अपवाद फेंकेगा:
आउटपुट
addition=30 PHP Fatal error: Uncaught TypeError: Argument 1 passed to add() must be of the type integer, float given