आज की PHP अपनाएँ: स्ट्रिक्ट टाइप, ऐरो फ़ंक्शन, nullsafe ऑपरेटर, enum, और match व्यंजक।
इस पाठ को Kodokon में खोलेंआधुनिक PHP टाइपिंग को अपनाती है। declare(strict_types=1), जिसे फ़ाइल के पहले कथन के रूप में रखा जाता है, अंतर्निहित रूपांतरणों को अक्षम कर देता है: किसी float पैरामीटर को स्ट्रिंग '10' पास करना खामोशी से रूपांतरित होने के बजाय एक TypeError फेंकता है। पैरामीटर और रिटर्न वैल्यू को टाइप करें: आपकी त्रुटियाँ जल्दी, सही जगह पर सामने आती हैं, न कि तीन फ़ाइलों बाद।
<?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
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);nullsafe ऑपरेटर ?-> किसी कॉल को उसी क्षण शॉर्ट-सर्किट कर देता है जब शृंखला की कोई कड़ी null हो, बजाय एक घातक त्रुटि उत्पन्न करने के। ?? के साथ मिलकर, यह if कथनों के पिरामिडों को एक ही पठनीय लाइन से बदल देता है।
<?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';enum मूल्यों के बंद समुच्चयों (स्थितियाँ, भूमिकाएँ) को एक वास्तविक टाइप देते हैं: किसी अनस्तित्व स्थिति को बनाना असंभव हो जाता है। और match, switch की तुलना में एक स्पष्ट सुधार है: कड़ाई से तुलना, वैल्यू के रूप में लौटाया गया परिणाम, और यदि कोई केस मेल न खाए तो एक UnhandledMatchError - चूक के विरुद्ध एक सुरक्षा।
<?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();