payment by upi: sinhamit@icici or payment by bank account name: amit kumar sinha, account number: 2646728782 IFSC code: KKBK0005660 SWIFT: KKBKINBB

Please support if you like my work by payment through upi: sinhamit@icici or payment by bank

account name: Amit Kumar Sinha,
account number: 2646728782
IFSC code: KKBK0005660
SWIFT: KKBKINBB


Type Hinting   in Category: पीएचपीलेवल2   by amit

🕙 Posted on 2023-06-17 at 10:35:12


पैरामीटर के (डेटा) प्रकार

    आपने पिछले पृष्ठ में सीखा है कि किसी फ़ंक्शन को कॉल/आह्वान (invoke) करने के समय मान (शाब्दिक या चर/स्थिर से) को तर्क (argument) के रूप में पारित किया जा सकता है। जैसा कि एक फ़ंक्शन के बाहर टाइप-कास्टिंग किया जा सकता है, आप तर्कों के रूप में पास किए गए मानों को भी संभाल (handle) सकते हैं, और उन्हें कस्टम फ़ंक्शन functionName के ठीक बाद () कोष्ठकों में टाइप-कास्ट कर सकते हैं (फ़ंक्शन ब्लॉक {} कर्ली ब्रेसिज़ में उपयोग करने से पहले)

    इसी तरह, कस्टम फ़ंक्शन ब्लॉक {} कर्ली ब्रेसिज़ के अंदर सभी कोडों को संसाधित करने के बाद, लौटाए गए मान (returned value) का डेटा-प्रकार क्या होना चाहिए, इसे भी संभाला (handle) जा सकता है। याद रखें कि PHP एक ढीली डेटा-टाइप स्क्रिप्टिंग भाषा है। इसका अर्थ है कि किसी भी चर नाम के डेटा-प्रकार को किसी भी समय बदला जा सकता है। निम्नलिखित उदाहरणों में पैरामीटर के प्रकार लिखने के लिए इन विकल्पों को देखते हैं। कस्टम फ़ंक्शन में टाइप-हिंटिंग लिखने के लिए सिंटेक्स है:

<?php function functionName( array $param ) { /* statements inside function block */ } ?><!-- कर्ली ब्रेस बंद करने से ठीक पहले सिंगल-लाइन PHP कमेंट का उपयोग करने से ERROR हो जाएगा! टाइप-कास्टिंग के विपरीत, टाइप-हिंटिंग bool int float string array कोष्ठकों के बिना होते हैं, जिन्हें पैरामीटर नाम के ठीक पहले लिखा जा सकता है। -->

<?php
  function addition( int $param1, int $param2 ) {
    var_dump( $param1, $param2 );         /* परिणाम के पहले दो मानों को आउटपुट करता है, जैसा कि नीचे दिखाया गया है: */
    return $param1 + $param2;               /* परिणाम के तीसरे मान को आउटपुट करता है, जैसा कि नीचे दिखाया गया है: */
  }
  $num1 = 2.3; $num2 = 3.4;
  var_dump( $num1, $num2 );                   /* आउटपुट float(2.3) float(3.4) − तर्क के मूल (original) डेटा-प्रकार */
  echo '<br />';
  var_dump( addition( $num1, $num2 ) );     /* आउटपुट int(2) int(3) int(5) − जब फ़ंक्शन को कॉल किया जाता है, डेटा-प्रकार को int में बदल दिया जाता है */
?>

    उपरोक्त उदाहरण में, आप देख सकते हैं कि कस्टम फ़ंक्शन नाम addition के ठीक बाद () कोष्ठक के भीतर, int आरक्षित कीवर्ड को प्रत्येक पैरामीटर नाम $param1 और $param2 से पहले रखा गया है। यह तर्कों का टाइप-जुगलिंग या टाइप-कोर्सन है, या कस्टम फ़ंक्शन के पैरामीटर के टाइप-हिंटिंग (डेटा-प्रकार की अपेक्षा expecting) है। कस्टम फ़ंक्शन को कॉल/आह्वान करते समय प्रत्येक मान का जो भी डेटा-प्रकार पारित किया जाता है, वे उस फ़ंक्शन के संबंधित पैरामीटर के डेटा-प्रकार में बदल जाते हैं।

<?php
  function multiply( float $param1, float $param2 ) {
    var_dump( $param1, $param2 );       /* प्रत्येक पैरामीटर का डेटा-प्रकार और मूल्य परिणाम से पहले दिखाता है, जब हर बार इस फ़ंक्शन को कॉल/आह्वान करते है। */
    return $param1 * $param2;              /* परिणाम के तीसरे मान को आउटपुट करता है, जैसा कि नीचे दिखाया गया है: */
  }
  var_dump( multiply( true, false ) );       // आउटपुट float(1) float(0) float(0) है
  echo '<br />';
  var_dump( multiply( 2, '3' ) );                 // आउटपुट float(2) float(3) float(6) है
?>

    उपरोक्त उदाहरणों में से पहले में, जब फ़्लोटिंग पॉइंट नंबरों को तर्कों के रूप में पारित किया जाता है, तो वे पूर्णांक डेटा-प्रकार में परिवर्तित हो जाते हैं। . (संख्या­त्मक मान में डॉट या दशमलव बिंदु) के बाद दशमलव मान छांट (truncate) दिया जाता है और इसलिए, 2.3 और 3.4 को क्रमशः 2 और 3 में बदल दिया जाता है। दूसरा उदाहरण पहले उदाहरण के समान है, और बूलियन मान, true और false क्रमशः float(1) और float(0) में परिवर्तित हो जाते हैं। इसके अलावा, दूसरे उदाहरण में, 2 (पूर्णांक) और '3' (स्ट्रिंग) क्रमशः float(2) और float(3) में परिवर्तित हो जाते हैं।

    हालाँकि, उपरोक्त दो उदाहरणों में लौटाया गया (returned) मान (value) का डेटा-प्रकार अभी तक टाइप-हिंटिंग नहीं है, और वे return कीवर्ड के बाद उल्लिखित अभिव्यक्ति (expression) का डिफ़ॉल्ट परिणाम हैं, अर्थात दो पूर्णांकों के योग से पूर्णांक डेटा-प्रकार प्राप्त होता है। इसी तरह, दो फ्लोटिंग पॉइंट नंबरों के गुणन के परिणामस्वरूप फ्लोट डेटा-टाइप होता है।

<?php
  $cms_user = true;     /* आप अपनी CMS प्रोजेक्ट फ़ाइलों के शीर्ष पर कुछ चर परिभाषित कर सकते हैं */
  function check_user( bool $cms_user ) {
  if( $cms_user ) { $cms_tutorial = 'visible'; }
  return $cms_tutorial;
  }
  echo check_user( $cms_user );     /* कुछ अनुमति प्राप्त करने के बाद, अर्थात आउटपुट visible होने पर, आप ट्यूटोरियल दिखा सकते हैं। */
?>

    उपरोक्त उदाहरण में, आप आमतौर पर सीएमएस (सामग्री प्रबंधन प्रणाली) में उपयोग किए जाने वाले एक व्यावहारिक उदाहरण को देख सकते हैं, जहां पैरामीटर के लिए टाइप-हिंटिंग bool डेटा-टाइप का हो सकता है। जब डेटा-प्रकार एक तर्क के रूप में पारित किया जाता है, टाइप-कॉर्स्ड (coerced) नहीं होता है (अर्थात, उपयुक्त पैरामीटर में परिवर्तित नहीं होता है), यह घातक त्रुटि परिणाम देगा। यह कभी-कभी कुछ बग का कारण बन सकता है। आपको सावधानीपूर्वक और चालाकी से PHP स्क्रिप्ट लिखनी चाहिए। एक जटिल सीएमएस स्मार्ट (चालाक) तरीके से कोड लिखने की तरकीबें हैं।

<?php
  function my_function( string $param ) {
    var_dump( $param );       // आउटपुट ERROR जैसा कि नीचे दिखाया गया है:
  }
  $my_arg = [];                        // कोई भी स्केलर मान (लेकिन नहीं NULL) कोई ERROR आउटपुट नहीं करेगा
  my_function( $my_arg );
?>


Fatal error: Uncaught TypeError: my_function(): Argument #1 ($param) must be of type string, array given, called in C:\xampp\htdocs\php_project\index.php on line 6 and defined in C:\xampp\htdocs\php_project\index.php:2 Stack trace: #0 C:\xampp\htdocs\php_project\index.php(6): my_function(Array) #1 {main} thrown in C:\xampp\htdocs\php_project\index.php on line 2

    हालाँकि, सख्त मोड का उपयोग नहीं करने पर भी (नीचे देखें), टाइप-हिंटिंग द्वारा array डेटा-प्रकार की अपेक्षा करने पर आपको ERROR मिलेगा, जब किसी भी फ़ंक्शन में पास किए गए तर्क स्केलर डेटा-प्रकार के होंगे (जो PHP inter­preter उन्हें पैरामीटर के रूप में टाइप-जुगल नहीं कर सकता) और इसके विपरीत भी (vice-versa)। उदाहरण के लिए, जब किसी फ़ंक्शन में पैरामीटर string डेटा-प्रकार अपेक्षित होता है, और किसी ऐरे (array) लिटरल को तर्क के रूप में पारित किया जाता है, तो आपको ERROR मिलेगा जैसा कि ऊपर दिए गए उदाहरण में दिखाया गया है।

    हालाँकि, आप declare(strict_types=1); (सख्त मोड) का उपयोग कर सकते हैं (तर्कों के रूप में केवल उन डेटा-प्रकार के मानों की अपेक्षा करने के लिए) जो किसी कस्टम फ़ंक्शन के () कोष्ठकों में पैरामीटर के लिए टाइप-हिंटिंग उल्लिखित हैं। सख्त टाइप-हिंटिंग केवल स्केलर प्रकार की घोषणाओं के लिए परिभाषित की गई है। यह declare() कथन/निर्देश (directive) आपकी PHP फ़ाइल के शीर्ष पर होना चाहिए। जब आप उपरोक्त declare() निर्देश किसी अन्य PHP फ़ाइल में लिखते हैं, लेकिन index.php में नहीं, तो निम्नलिखित ERROR दिखाया जाएगा:


Fatal error: strict_types declaration must be the very first statement in the script in C:\xampp\htdocs\php_project\phptest.php on line 1

    जब आप इसे अपनी PHP फ़ाइल में लिखते हैं, तो आप अपने VSCode संपादक में टेढ़ी-मेढ़ी लाल रेखा ERROR संकेत प्राप्त कर सकते हैं। ऐसा इसलिए है क्योंकि आपके प्रोजेक्ट फ़ोल्डर में index.php फ़ाइल नहीं हो सकती है । आपको एक नई फ़ाइल बनानी चाहिए, अर्थात्, index.php और उस फ़ाइल में सख्त मोड घोषणा और उपरोक्त उदाहरण लिखें। यह ऊपर दिखाया गया ERROR को हटा देगा।

    जब कस्टम फ़ंक्शन बूलियन मान को तर्क के रूप में अपेक्षा करता है, और आप किसी अन्य डेटा-प्रकार का उपयोग करते हैं, उदाहरण के लिए, $cms_user = 1; (पूर्णांक डेटा-प्रकार), सख्त मोड में अनकॉट टाइप-एरर (Uncaught TypeError) दिखाया जाएगा । इसलिए, declare(strict_types=1); निर्देश का उपयोग करते समय (यहां तक ​​​​कि index.php फ़ाइल के शीर्ष पर भी), आपको कस्टम फ़ंक्शन को कॉल/आह्वान (invoke) करते समय अन्य सभी आवश्यकताओं (तर्को आदि) का ध्यान रखना होगा।


Fatal error: Uncaught TypeError: check_user(): Argument #1 ($cms_user) must be of type bool, int given, called in C:\xampp\htdocs\php_project\index.php on line 8 and defined in C:\xampp\htdocs\php_project\index.php:4 Stack trace: #0 C:\xampp\htdocs\php_project\index.php(8): check_user(1) #1 {main} thrown in C:\xampp\htdocs\php_project\index.php on line 4

    जब सख्त मोड घोषणा में फ्लोट डेटा-प्रकार की अपेक्षा की जाती है, तो पूर्णांक (integer) मान पास करने पर भी, ERROR नहीं दिखाया जाएगा। हालाँकि, जब तर्क के रूप में संख्यात्मक स्ट्रिंग, यानी एकल/दोहरे उद्धरणों की एक जोड़ी के भीतर संख्याएँ, पारित की जाती हैं, और पैरामीटर के रूप में int या float टाइप-हिंटिंग को अपेक्षित किया जाता है, तब सख्त मोड में ERROR को दिखाया जाएगा।

    आप अगले पेज में पैरामीटर के टाइप-हिंटिंग और कस्टम फ़ंक्शन के रिटर्न प्रकार के बारे में अधिक जानेंगे।


Leave a Comment: