खोज…
वाक्य - विन्यास
- फ़ंक्शन func_name ($ पैरामीटरName1, $ पैरामीटरName2) {code_to_run (); }
- समारोह func_name ($ वैकल्पिकप्रकार = default_value) {code_to_run (); }
- फ़ंक्शन func_name (type_name $ पैरामीटर नाम) {code_to_run (); }
- फ़ंक्शन और रिटर्न_बाइ_प्रेशन () {code_to_run (); }
- function func_name (& $ referenceParameter) {code_to_run (); }
- समारोह func_name (... $ varadicParameters) {code_to_run (); } // PHP 5.6+
- function func_name (type_name & ... $ varRefParams) {code_to_run (); } // PHP 5.6+
- समारोह func_name (): return_type {code_To_run (); } // PHP 7.0+
बुनियादी समारोह उपयोग
एक बुनियादी कार्य इस तरह परिभाषित और निष्पादित किया जाता है:
function hello($name)
{
print "Hello $name";
}
hello("Alice");
वैकल्पिक पैरामीटर
फ़ंक्शंस में वैकल्पिक पैरामीटर हो सकते हैं, उदाहरण के लिए:
function hello($name, $style = 'Formal')
{
switch ($style) {
case 'Formal':
print "Good Day $name";
break;
case 'Informal':
print "Hi $name";
break;
case 'Australian':
print "G'day $name";
break;
default:
print "Hello $name";
break;
}
}
hello('Alice');
// Good Day Alice
hello('Alice', 'Australian');
// G'day Alice
संदर्भ द्वारा तर्क पारित करना
फ़ंक्शन तर्क को "संदर्भ द्वारा" पारित किया जा सकता है, जिससे फ़ंक्शन को फ़ंक्शन के बाहर उपयोग किए गए चर को संशोधित करने की अनुमति मिलती है:
function pluralize(&$word)
{
if (substr($word, -1) == 'y') {
$word = substr($word, 0, -1) . 'ies';
} else {
$word .= 's';
}
}
$word = 'Bannana';
pluralize($word);
print $word;
// Bannanas
ऑब्जेक्ट तर्क हमेशा संदर्भ द्वारा पारित किए जाते हैं:
function addOneDay($date)
{
$date->modify('+1 day');
}
$date = new DateTime('2014-02-28');
addOneDay($date);
print $date->format('Y-m-d');
// 2014-03-01
किसी ऑब्जेक्ट को संदर्भ द्वारा पास करने से बचने के लिए, आपको ऑब्जेक्ट को clone
करना चाहिए।
संदर्भ द्वारा पासिंग को मापदंडों को वापस करने के लिए वैकल्पिक तरीके के रूप में भी इस्तेमाल किया जा सकता है। उदाहरण के लिए, socket_getpeername
फ़ंक्शन:
bool socket_getpeername ( resource $socket , string &$address [, int &$port ] )
यह विधि वास्तव में सहकर्मी के पते और पोर्ट को वापस करने का लक्ष्य रखती है, लेकिन चूंकि लौटने के लिए दो मूल्य हैं, इसलिए यह संदर्भ मापदंडों का उपयोग करने का विकल्प चुनता है। इसे इस तरह कहा जा सकता है:
if(!socket_getpeername($socket, $address, $port)) {
throw new RuntimeException(socket_last_error());
}
echo "Peer: $address:$port\n";
चर $address
और $port
को पहले परिभाषित करने की आवश्यकता नहीं है। वे करेंगे:
- पहले
null
रूप में परिभाषित किया जाए, - फिर पूर्वनिर्धारित
null
मान के साथ फ़ंक्शन में पास हुआ - फिर फ़ंक्शन में संशोधित किया गया
- कॉलिंग संदर्भ में पता और पोर्ट के रूप में परिभाषित किया गया।
चर-लंबाई तर्क सूची
PHP 5.6 ने चर-लंबाई तर्क सूची (उर्फ varargs, varadic तर्क) शुरू की, ...
तर्क नाम के पहले टोकन का उपयोग करके संकेत मिलता है कि पैरामीटर वेरिएडिक है, अर्थात यह एक सरणी है जिसमें उस एक से सभी आपूर्ति किए गए पैरामीटर शामिल हैं।
function variadic_func($nonVariadic, ...$variadic) {
echo json_encode($variadic);
}
variadic_func(1, 2, 3, 4); // prints [2,3,4]
प्रकार के नाम सामने जोड़े जा सकते हैं ...
:
function foo(Bar ...$bars) {}
&
संदर्भ ऑपरेटर ...
से पहले जोड़ा जा सकता है, लेकिन टाइप नाम के बाद (यदि कोई हो)। इस उदाहरण पर विचार करें:
class Foo{}
function a(Foo &...$foos){
$i = 0;
foreach($a as &$foo){ // note the &
$foo = $i++;
}
}
$a = new Foo;
$c = new Foo;
$b =& $c;
a($a, $b);
var_dump($a, $b, $c);
आउटपुट:
int(0)
int(1)
int(1)
दूसरी ओर, तर्कों की एक सरणी (या Traversable
) को एक तर्क सूची के रूप में एक समारोह में पारित करने के लिए अनपैक किया जा सकता है:
var_dump(...hash_algos());
आउटपुट:
string(3) "md2"
string(3) "md4"
string(3) "md5"
...
इस स्निपेट का उपयोग किए बिना तुलना करें ...
:
var_dump(hash_algos());
आउटपुट:
array(46) {
[0]=>
string(3) "md2"
[1]=>
string(3) "md4"
...
}
इसलिए, चर कार्यों के लिए पुनर्निर्देशित कार्य अब आसानी से किए जा सकते हैं, उदाहरण के लिए:
public function formatQuery($query, ...$args){
return sprintf($query, ...array_map([$mysqli, "real_escape_string"], $args));
}
सरणियों के अलावा, Traversable
एस, जैसे Iterator
(विशेष रूप से एसपीएल से इसके कई उपवर्ग) का भी उपयोग किया जा सकता है। उदाहरण के लिए:
$iterator = new LimitIterator(new ArrayIterator([0, 1, 2, 3, 4, 5, 6]), 2, 3);
echo bin2hex(pack("c*", ...$it)); // Output: 020304
उदाहरण के लिए, यदि पुनरावृति पुनरावृत्ति करता है:
$iterator = new InfiniteIterator(new ArrayIterator([0, 1, 2, 3, 4]));
var_dump(...$iterator);
PHP के विभिन्न संस्करण अलग तरह से व्यवहार करते हैं:
- PHP 7.0.0 से PHP 7.1.0 (बीटा 1) तक:
- एक विभाजन दोष उत्पन्न होगा
- PHP प्रक्रिया कोड 139 के साथ बाहर निकल जाएगी
- PHP 5.6 में:
- मेमोरी थकावट की एक घातक त्रुटि ("% d बाइट्स समाप्त की गई मेमोरी आकार") दिखाई जाएगी।
- PHP प्रक्रिया कोड 255 के साथ बाहर निकल जाएगी
नोट: HHVM (v3.10 - v3.12)
Traversable
s को अनपैक करने का समर्थन नहीं करता है। इस प्रयास में एक चेतावनी संदेश "केवल कंटेनरों को अनपैक किया जा सकता है" दिखाया जाएगा।
कार्यक्षेत्र
कार्यों के अंदर चर इस तरह एक स्थानीय दायरे के अंदर है
$number = 5
function foo(){
$number = 10
return $number
}
foo(); //Will print 10 because text defined inside function is a local variable