PHP में सख्त प्रकार क्या करते हैं?




php-7.2 (2)

strict_types टाइप के ज़बरदस्ती को प्रभावित करता है।

सख्त प्रकारों से पहले, int $x मतलब था " $x मूल्य एक इंट के समान होना चाहिए, लेकिन जरूरी नहीं कि एक इंट उचित हो।" कुछ भी जो एक int उचित के लिए coerced किया जा सकता है, प्रकार संकेत पारित करेगा, सहित:

  • a int उचित ( 242 ),
  • एक फ्लोट ( 10.17 ),
  • एक बूल ( 1 ),
  • null , या
  • अग्रणी अंक ( 13 Ghosts ) के साथ एक स्ट्रिंग।

अब, strict_types=1 सेट strict_types=1 , आप इंजन को बताते हैं कि int का अर्थ "वास्तव में और केवल एक int उचित" होना चाहिए। और कुछ नहीं। आपके पास एक शानदार और बढ़िया आश्वासन है जो आपको बिल्कुल मिल रहा है और केवल वही दिया गया है, जो बिना किसी रूपांतरण और संभावित नुकसान के दिया गया है।

उदाहरण:

<?php
function get_quantity(): int {
    return '100 apples';
}
echo get_quantity() . PHP_EOL;

एक संभावित भ्रामक परिणाम देता है:

Notice: A non well formed numeric value encountered in /Users/bishop/tmp/pmkr-994/junk.php on line 4
100

अधिकांश डेवलपर्स उम्मीद करेंगे, मुझे लगता है, एक int का मतलब "केवल एक इंट" है। लेकिन यह नहीं है, इसका मतलब है "एक int की तरह कुछ भी"। सख्त प्रकारों को सक्षम करने से संभावित अपेक्षित और वांछित व्यवहार होता है:

<?php declare(strict_types=1);

function get_quantity(): int {
    return '100 apples';
}
echo get_quantity() . PHP_EOL;

पैदावार:

Fatal error: Uncaught TypeError: Return value of get_quantity() must be of the type int, string returned in example.php:4

मुझे लगता है कि यहां दो पाठ हैं, यदि आप टाइप संकेत का उपयोग करते हैं:

  • strict_types=1 प्रयोग करें, हमेशा।
  • अपवादों में strict_types बदलें, यदि आप strict_types जोड़ना भूल जाते हैं।

मैंने PHP7 में इस नई लाइन को देखा है, लेकिन कोई भी वास्तव में इसका मतलब नहीं बताता है। मैंने इसे देखा है और वे सभी के बारे में बात करते हैं कि क्या आप इसे किसी प्रकार की चीज की तरह सक्षम कर रहे हैं या नहीं।

declare(strict_types = 1);

यह क्या करता है? यह मेरे कोड को कैसे प्रभावित करता है? क्या मुझे यह करना चाहिए? कुछ स्पष्टीकरण अच्छा होगा।


ट्रीहाउस ब्लॉग से :

PHP 7 के साथ हमने अब स्केलर प्रकार जोड़े हैं। विशेष रूप से: इंट, फ्लोट, स्ट्रिंग और बूल।

स्केलर प्रकार के संकेत जोड़ने और सख्त आवश्यकताओं को सक्षम करने से, यह आशा की जाती है कि अधिक सही और स्व-दस्तावेजीकरण PHP प्रोग्राम लिखे जा सकते हैं। यह आपको अपने कोड पर अधिक नियंत्रण भी देता है और कोड को पढ़ना आसान बना सकता है।

डिफ़ॉल्ट रूप से, स्केलर प्रकार-घोषणाएं गैर-सख्त हैं, जिसका अर्थ है कि वे मूल प्रकार को बदलने का प्रयास करेंगे प्रकार-घोषणा द्वारा निर्दिष्ट प्रकार से मिलान करने के लिए। दूसरे शब्दों में, यदि आप एक स्ट्रिंग को पास करते हैं जो एक फ़ंक्शन में एक संख्या के साथ शुरू होती है जिसे फ्लोट की आवश्यकता होती है, तो यह शुरुआत से संख्या को पकड़ लेगा और बाकी सब को हटा देगा। एक फ्लोट को एक फ़ंक्शन में पास करना जिसमें एक इंट की आवश्यकता होती है इंट (1) बन जाएगा।

डिफ़ॉल्ट रूप से, यदि संभव हो तो PHP गलत प्रकार के मानों को अपेक्षित स्केलर प्रकार में डालेगा। उदाहरण के लिए, एक फ़ंक्शन जिसे एक पैरामीटर के लिए पूर्णांक दिया जाता है जो एक स्ट्रिंग की अपेक्षा करता है उसे टाइप स्ट्रिंग का एक चर मिलेगा।

सख्त प्रकार अक्षम ( eval ):

<?php

  function AddIntAndFloat(int $a, float $b) : int 
  {
      return $a + $b;
  }

  echo AddIntAndFloat(1.4,'2');
  /*
  * without strict typing, php will change float(1.4) to int(1)
  * and string('2') to float(2.0) and returns int(3)
  */

प्रति फ़ाइल के आधार पर सख्त मोड को सक्षम करना संभव है। सख्त मोड में, केवल सटीक प्रकार की घोषणा के एक चर को स्वीकार किया जाएगा, या एक टाइपर फेंका जाएगा। इस नियम का एकमात्र अपवाद यह है कि एक पूर्णांक एक फ़ंक्शन को दिया जा सकता है जो फ्लोट की अपेक्षा करता है। आंतरिक कार्यों के भीतर से फ़ंक्शन कॉल सख्त_टाइप्स घोषणा से प्रभावित नहीं होंगे।

सख्त मोड को सक्षम करने के लिए, डिक्लेयर स्टेटमेंट का उपयोग सख्त_टाइप्स घोषणा के साथ किया जाता है:

सख्त प्रकार सक्षम ( eval ):

<?php declare(strict_types=1);

  function AddIntAndFloat(int $a, float $b): int 
  {
      return (string) $a + $b;
  }

  echo AddIntAndFloat(1.4,'2');        
  // Fatal error: Uncaught TypeError: Argument 1 passed to AddIntAndFloat() must be of the type int, float given
  echo AddIntAndFloat(1,'2');
  // Fatal error: Uncaught TypeError: Argument 2 passed to AddIntAndFloat() must be of the type float, string given

  // Integers can be passed as float-points : 
  echo AddIntAndFloat(1,1);
  // Fatal error: Uncaught TypeError: Return value of AddIntAndFloat() must be of the type integer, string returned

काम कर उदाहरण:

<?php

declare(strict_types=1);

function AddFloats(float $a, float $b) : float 
{
    return $a+$b;
}

$float = AddFloats(1.5,2.0); // returns 3.5

function AddFloatsReturnInt(float $a, float $b) : int 
{
    return (int) $a+$b;
}

$int = AddFloatsReturnInt($float,1.5); // returns 5

function Say(string $message): void // as on php 7.2
{
    echo $message;
}

Say('Hello, world!'); // prints hello world

function ArrayToStdClass(array $array): stdClass
{
    return (object) $array;
}

$object = ArrayToStdClass(['name' => 'azjezz','age' => 100]); // returns an stdClass 

function StdClassToArray(stdClass $object): array
{
    return (array) $object;
}

$array = StdClassToArray($object); // returns array

function ArrayToObject(array $array): object // as of php 7.2
{
    return new ArrayObject($array);
}

function ObjectToArray(ArrayObject $object): array
{
    return $object->getArrayCopy();
}

var_dump( ObjectToArray( ArrayToObject( [1 => 'a' ] ) ) ); // array(1 => 'a');




php-7.2