PHP7 में अशक्त वापसी प्रकार


159

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

function returnHello(): string {
    return 'hello';
}

अक्सर ऐसा होता है कि एक मूल्य हमेशा मौजूद नहीं होता है, और हो सकता है कि आप या तो किसी प्रकार का कुछ, या अशक्त हो। जब आप अपने डिफ़ॉल्ट को शून्य ( DateTime $time = null) पर सेट करके पैरामीटर को अशक्त बना सकते हैं , तो रिटर्न प्रकारों के लिए ऐसा करने का कोई तरीका नहीं दिखता है। क्या यह वास्तव में मामला है, या मैं किसी भी तरह से नहीं कर रहा हूं कि यह कैसे करना है? ये काम नहीं करते हैं:

function returnHello(): string? {
    return 'hello';
}

function returnHello(): string|null {
    return 'hello';
}

8
PHP7 अभी तक अशक्त रिटर्न प्रकारों की अनुमति नहीं देगा, लेकिन यहां एक RFC है जिसका उद्देश्य PHP 7.1 में इसे संबोधित करना है । फिर प्रस्तावित प्रचार होगाfunction returnString(?string $stringNull) : ?string { return $stringNull;}
एलियास वान ओओटगेम

1
मैंने अभी के लिए अपने आवेदन में अपवादों का दुरुपयोग करके अशक्तता का अनुकरण किया है। यदि आप मूर्ख होने के साथ ठीक हैं, तो यह काम आ सकता है: github.com/JeroenDeDauw/OhMyPhp/blob/master/src/…
Jeroen De Dauw

शायद PHP7 Trowableइंटरफ़ेस का उपयोग करने के लिए यह अधिक समझ में आता है (विशेष रूप से, विस्तार TypeError)
एलियास वान ओटगेम

जवाबों:


258

PHP 7.1 अब अशक्त रिटर्न प्रकारों का समर्थन करता है । पहला RFC जो मैंने जोड़ा है, वह है:

function nullOrString(int $foo) : ?string
{
    return $foo%2 ? "odd" : null;
}

पुराना उत्तर:

चूंकि मेरी टिप्पणी वास्तव में सवाल का जवाब थी:

PHP 7 अभी तक अशक्त रिटर्न-प्रकारों का समर्थन नहीं करेगा, लेकिन वहाँ एक RFC पता करने के लिए बस है, यह PHP 7.1 में उतरने का लक्ष्य रखता है। यदि यह पास हो जाता है, तो सिंटैक्स सभी प्रकार के संकेत (दोनों प्रकार के रिटर्न और टाइप-संकेत) को प्रभावित करेगा।

public function returnStringOrNull(?array $optionalArray) : ?string
{
    if ($optionalArray) {
        return implode(', ', $optionalArray);//string returned here
    }
    return null;
}

यूनियन प्रकारों को जोड़ने के लिए एक प्रतिस्पर्धी RFC भी है , जो एक ही काम कर सकेगी, लेकिन अलग दिखेगी:

public function returnStringOrNull(array|null $optionalArray) : string|null
{
    if ($optionalArray) {
        return implode(', ', $optionalArray);//string returned here
    }
    return null;
}

अभी के लिए, हालांकि, आपको लिखना होगा:

public function returnStringOrNull( array $optionalArray = null)
{
    if ($optionalArray) {
        return implode(', ', $optionalArray);
    }
}

या बस वापसी प्रकार के अनुरूप होने के लिए एक खाली स्ट्रिंग लौटाएं, और गलत मान की जाँच करें:

public function returnStringOrNull( array $optionalArray = null) : string
{
    if ($optionalArray) {
        return implode(', ', $optionalArray);
    }
    return '';
}
//call
$string = $x->returnStringOrNull();
if (!$string) {
    $string = $x->returnStringOrNull(range(1, 10));
}

5
PHP 7 won't support nullable return-types just yet, but there's an RFC out to address just that- हाँ, RFC, "अभी तक"। मुझे गलत मत समझो - मैं वास्तव में भारी PHP उपयोगकर्ता हूं जो अब तक PHP3 बार वास्तव में भद्दा है , कोई अंतराल नहीं है, लेकिन जब मैंने इन सभी RFC को देखा तो उन्होंने 7 के लिए अस्वीकार कर दिया, मेरी धारणा सिर्फ "डब्ल्यूटीएफ ?!" थी। उपयोगकर्ता गंदगी को देखते हैं और इसे पिछड़े संगत तरीके से साफ करने के लिए तैयार हैं और उन्हें सिर्फ "नहीं" मिलता है। गंदगी साफ करने के तरीके? फिक्स्ड nullभी विशेष नागरिक नहीं है? नहीं, जरूरत नहीं। सभी सामान मामले को संवेदनशील बनाने के लिए विकल्प जोड़ें ? नाह .. और फिर, आश्चर्य कि लोग स्विच करते हैं।
मार्सिन ऑर्लोव्स्की

1
@MarcinOrlowski: एक अशक्त वापसी प्रकार-संकेत समझ में आता है। मैंने 7 के लिए RFC के एक जोड़े का पालन किया है, और मैं उनमें से अधिकांश के लिए बहुत सारे लोगों को अस्वीकार करने के लिए सहमत हूं। वे जिस बदलाव पर ध्यान केंद्रित कर रहे थे वह भाषा पर उतना नहीं था क्योंकि वे रनटाइम और कंपाइलर पर थे। RFC के कुछ के लिए मना कर दिया गया था, यह समझने के लिए चर्चा के माध्यम से पढ़ने लायक है कि उन्होंने उन परिवर्तनों को लागू करने के लिए क्यों नहीं चुना (उदाहरण के लिए पदावनत var)। एक ख़ुशी की बात यह है कि इसके बजाय, उन्होंने एक से कई अच्छे-से-अच्छे (उदाहरण के लिए स्पेसशिप ऑपरेटर) को स्वीकार किया
एलियास वान ओटगेम

@EliasVanOotegem अशक्त प्रकार अब ठीक से समर्थित हैं, क्योंकि 7.1 1 दिसंबर को जारी किया गया था।
lonesomeday

@lonesomeday: वास्तव में यह करता है, मेरे जवाब के निचले भाग में लिंक + मूल उदाहरण जोड़ा गया
इलायस वान ओटगेम

mmm ish इस उत्तर को अद्यतन करने के लिए एक अच्छा प्रकार है! यानी संघ प्रकार PHP 7.1 में समर्थित नहीं दिखता है
डेनिस

67

Nullable Types PHP 7.1 में उपलब्ध हैं।

यह एक वाक्यविन्यास उदाहरण है:

public function getName(): ?string
{
    return $this->name; // name can be null
}

PHP 7.1 अब GA है और आप PHP 7.0 से अपग्रेड कर सकते हैं (केवल कुछ पिछड़े असंगत परिवर्तन हैं जिन्हें आपको जांचना है)


22
आईएमओ यह "अशक्त" को लागू किए बिना रिटर्न प्रकार की घोषणाएं देने के लिए एक मजाक है। "अशक्त" सुविधा के लागू होने तक रिटर्न प्रकार अनुपयोगी हैं।
joonas.fi 14

2
@ joonas.fi IMO कड़ाई से टाइप किए गए रिटर्न मान हमेशा उस प्रकार के होने चाहिए, एक शून्य रिटर्न उस अनुबंध पर पकड़ नहीं रखता है और एक अशक्त मूल्य के कारण को अधिक अर्थ देने वाले अपवाद को फेंकना चाहिए।
स्टीव बुज़ोनास

8
@SteveBuzonas यदि आप एक विधि पर विचार करते हैं getAgeInYears () एक व्यक्ति का प्रतिनिधित्व करने वाली एक वस्तु पर, आप एक व्यक्ति को कैसे मॉडल करेंगे जिसने हमें उसकी उम्र नहीं बताई है? वापसी शून्य? वापसी 0? शब्दार्थ का अर्थ है "हम नहीं जानते", जबकि शब्दार्थ का अर्थ है "व्यक्ति 0 वर्ष का है"। इसलिए मैं बहस करूँगा getAgeInYears ():? Int सबसे अच्छा डिज़ाइन होने के लिए। अपवादों को फेंकना अच्छी तरह से आरक्षित होना चाहिए ... असाधारण मामले। अधिकांश प्रणालियों में किसी व्यक्ति की आयु नहीं जानना एक असाधारण मामला नहीं माना जाना चाहिए।
जून

@ joonas.fi बहुत सच है, और यह एक आम बात है। हालाँकि, आपके कार्यान्वयन को अब इस बात से अवगत होना चाहिए कि क्षेत्र अशक्त है और स्पष्ट रूप से तदनुसार संभालता है। जो बहुत अच्छी तरह से किया जा सकता है जब शून्य को छोड़कर जो आसानी से एक कोशिश / पकड़ के साथ लागू किया जा सकता है। इसके अलावा, यदि निष्पादन को जारी रखने के लिए किसी को वास्तव में उस अशक्त क्षेत्र में एक मूल्य की आवश्यकता होती है, तो एक अपवाद एक बेहतर विकल्प है।
स्टीव बुज़ोनास

मैंने देखा है कि इस सिंटैक्स में PHPMD के कारण बहुत सारी त्रुटियाँ हैं। उम्मीद है कि वे जल्द ही इसे ठीक कर लें।
टॉम जविट

0

यह किसी भी प्रकार के साथ काम करता है।
उदाहरण:

public function getOpportunity(): ?Opportunity
{
    return $this->opportunity;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.