Kodokon kodokon.com

आधुनिक PHP: स्ट्रिक्ट टाइप, enum, match

आज की PHP अपनाएँ: स्ट्रिक्ट टाइप, ऐरो फ़ंक्शन, nullsafe ऑपरेटर, enum, और match व्यंजक।

9 मिनट · 3 प्रश्न

इस पाठ को Kodokon में खोलें

आधुनिक PHP टाइपिंग को अपनाती है। declare(strict_types=1), जिसे फ़ाइल के पहले कथन के रूप में रखा जाता है, अंतर्निहित रूपांतरणों को अक्षम कर देता है: किसी float पैरामीटर को स्ट्रिंग '10' पास करना खामोशी से रूपांतरित होने के बजाय एक TypeError फेंकता है। पैरामीटर और रिटर्न वैल्यू को टाइप करें: आपकी त्रुटियाँ जल्दी, सही जगह पर सामने आती हैं, न कि तीन फ़ाइलों बाद।

PHP
<?php

declare(strict_types=1);

function applyDiscount(
    float $price,
    float $rate = 0.1
): float {
    return round($price * (1 - $rate), 2);
}

echo applyDiscount(49.99);
echo PHP_EOL;
echo applyDiscount(100.0, 0.25);
एक टाइप किया गया हस्ताक्षर: फ़ंक्शन का अनुबंध स्पष्ट है।

ऐरो फ़ंक्शन fn एकल व्यंजक वाले अनाम फ़ंक्शन को संक्षिप्त कर देते हैं। पारंपरिक क्लोज़र पर एक बड़ा लाभ: वे बिना किसी use खंड के, मूल स्कोप के वेरिएबल को स्वतः कैप्चर कर लेते हैं। वे array_map() और array_filter() के साथ चमकते हैं।

PHP
<?php

declare(strict_types=1);

$prices = [12.5, 49.9, 8.0, 120.0];
$rate = 0.2;

$discounted = array_map(
    fn (float $p): float => round($p * (1 - $rate), 2),
    $prices
);

$affordable = array_filter(
    $discounted,
    fn (float $p): bool => $p < 50
);

print_r($affordable);
rate वेरिएबल बिना किसी use खंड के कैप्चर किया जाता है।

nullsafe ऑपरेटर ?-> किसी कॉल को उसी क्षण शॉर्ट-सर्किट कर देता है जब शृंखला की कोई कड़ी null हो, बजाय एक घातक त्रुटि उत्पन्न करने के। ?? के साथ मिलकर, यह if कथनों के पिरामिडों को एक ही पठनीय लाइन से बदल देता है।

PHP
<?php

declare(strict_types=1);

class Address
{
    public function __construct(
        public readonly string $city
    ) {
    }
}

class User
{
    public function __construct(
        public readonly ?Address $address = null
    ) {
    }
}

$alice = new User(new Address('Lyon'));
$bob = new User();

echo $alice->address?->city ?? 'Unknown city';
echo PHP_EOL;
echo $bob->address?->city ?? 'Unknown city';
Bob के लिए कोई त्रुटि नहीं: शृंखला पहले null पर रुक जाती है।

enum मूल्यों के बंद समुच्चयों (स्थितियाँ, भूमिकाएँ) को एक वास्तविक टाइप देते हैं: किसी अनस्तित्व स्थिति को बनाना असंभव हो जाता है। और match, switch की तुलना में एक स्पष्ट सुधार है: कड़ाई से तुलना, वैल्यू के रूप में लौटाया गया परिणाम, और यदि कोई केस मेल न खाए तो एक UnhandledMatchError - चूक के विरुद्ध एक सुरक्षा।

PHP
<?php

declare(strict_types=1);

enum OrderStatus: string
{
    case Pending = 'pending';
    case Shipped = 'shipped';
    case Delivered = 'delivered';

    public function label(): string
    {
        return match ($this) {
            self::Pending => 'Pending',
            self::Shipped => 'Shipped',
            self::Delivered => 'Delivered',
        };
    }
}

$status = OrderStatus::from('shipped');
echo $status->label();
स्ट्रिंग द्वारा समर्थित एक enum: किसी डेटाबेस के लिए आदर्श।

ज्ञान जांच

सुनिश्चित करें कि आपको इस पाठ के मुख्य बिंदु याद हैं।

  1. declare(strict_types=1) के साथ, यदि आप किसी float-टाइप पैरामीटर को स्ट्रिंग '10' पास करते हैं तो क्या होता है?
    • PHP स्ट्रिंग को खामोशी से 10.0 में बदल देता है
    • PHP केवल एक चेतावनी देता है और जारी रहता है
    • PHP एक TypeError फेंकता है
  2. एक ऐरो फ़ंक्शन fn() को एक पारंपरिक क्लोज़र function() से क्या अलग करता है?
    • इसमें कई कथन हो सकते हैं
    • यह बिना किसी use खंड के, मूल स्कोप के वेरिएबल को स्वतः कैप्चर कर लेता है
    • यह तेज़ी से चलता है
    • यह टाइप घोषित नहीं कर सकता
  3. match व्यंजक को switch पर क्या लाभ है?
    • यह कड़ाई से तुलना करता है (===), एक वैल्यू लौटाता है, और यदि कोई केस मेल न खाए तो एक त्रुटि फेंकता है
    • यह अधिक लचीलेपन के लिए ढीली तुलनाएँ (==) स्वीकार करता है
    • यह एक केस से अगले केस में गिरावट की अनुमति देता है