प्रकार संकेत का उपयोग करते समय अशक्त तर्क पारित नहीं कर सकते


192

निम्नलिखित कोड:

<?php

    class Type {

    }

    function foo(Type $t) {

    }

    foo(null);

?>

रन समय में विफल:

PHP Fatal error:  Argument 1 passed to foo() must not be null

क्यों इसे अन्य भाषाओं की तरह अशक्त पारित करने की अनुमति नहीं है?

जवाबों:


356

PHP 7.1 या नया (2 दिसंबर 2016 को जारी किया गया)

आप स्पष्ट रूप nullसे इस वाक्यविन्यास के साथ एक चर घोषित कर सकते हैं

function foo(?Type $t) {
}

इसका परिणाम यह होगा

$this->foo(new Type()); // ok
$this->foo(null); // ok
$this->foo(); // error

इसलिए, यदि आप एक वैकल्पिक तर्क चाहते हैं, तो आप सम्मेलन का अनुसरण कर सकते हैं, Type $t = nullजबकि यदि आपको तर्क को स्वीकार करने की आवश्यकता है nullऔर इसके प्रकार, आप उदाहरण के लिए अनुसरण कर सकते हैं।

आप यहां और पढ़ सकते हैं ।


PHP 7.0 या अधिक पुराना

आपको एक डिफ़ॉल्ट मान जोड़ना होगा

function foo(Type $t = null) {

}

इस तरह, आप इसे एक शून्य मान पास कर सकते हैं।

यह प्रकार घोषणाओं के बारे में मैनुअल में अनुभाग में प्रलेखित है :

NULLयदि पैरामीटर का डिफ़ॉल्ट मान सेट है, तो मूल्यों को स्वीकार करने के लिए घोषणा की जा सकती है NULL


10
तो क्यों अशक्त वस्तु अशक्त नहीं है ?
पचेरियर

4
अधिकांश भाषाएँ अशक्त को किसी भी प्रकार की अनुमति देती हैं। इस परिदृश्य में।
हेनरी

24
मेरी राय में यह एक खराब भाषा का निर्माण है। 1. अन्य भाषाओं में अशक्त किसी भी प्रकार के होने की क्षमता है, इस प्रकार अशक्त इस मामले में एक वैध तर्क बनाता है। 2: Php एक तर्क के लिए एक डिफ़ॉल्ट मान का उपयोग कर रहा है यह निर्दिष्ट करने के लिए कि शून्य स्वीकार्य है, यह अस्पष्ट है और यह एक अनिवार्य पैरामीटर को असंभव बनाता है, भले ही डेवलपर अशक्त रूप से पारित होने के लिए मजबूर करना चाहता हो।
हेनरी

2
मैं @ हेनरी के साथ सहमत हूं, इसके अलावा यह एक वैकल्पिक परम की तरह लग रहा है के बाद आवश्यक params करने के लिए अजीब लग रहा है।
फोर्स हीरो

6
मैं केवल 2 पर हीहेनरी से सहमत हूं। 1 इस तथ्य के बारे में कि आप अशक्त नहीं रह सकते हैं कि यह function foo(Type $t)बहुत अच्छी बात है; Null सन्दर्भ
कांस्टेंटिन गैलबेनू

35

PHP 7.1 से शुरू होकर, अशक्त प्रकार उपलब्ध हैं, क्योंकि फ़ंक्शन रिटर्न प्रकार और पैरामीटर दोनों हैं। प्रकार ?Tमें निर्दिष्ट प्रकार के मान हो सकते हैं T, या null

तो, आपका कार्य इस तरह दिख सकता है:

function foo(?Type $t)
{

}

जैसे ही आप PHP 7.1 के साथ काम कर सकते हैं, इस अंकन को प्राथमिकता दी जानी चाहिए function foo(Type $t = null), क्योंकि यह अभी भी कॉल करने वाले को पैरामीटर के लिए एक तर्क को स्पष्ट रूप से निर्दिष्ट करने के लिए मजबूर करता है $t


12

प्रयत्न:

function foo(Type $t = null) {

}

की जाँच करें पीएचपी समारोह तर्क


11
इसके साथ मेरी समस्या यह है कि यह फ़ंक्शन की परिभाषा को बदल देता है। अब पैरामीटर वैकल्पिक है - जो वास्तव में लेखक का इरादा नहीं है (हालांकि, यदि वह इसे अशक्त कर रहा है, तो यह संक्षेप में वैकल्पिक है)।
क्रश

7

जैसा कि पहले ही उल्लिखित अन्य उत्तर हैं, यह केवल तभी संभव है जब आप nullडिफ़ॉल्ट मान के रूप में निर्दिष्ट करते हैं ।

लेकिन सबसे साफ प्रकार-सुरक्षित वस्तु उन्मुख समाधान एक NullObject होगा :

interface FooInterface
{
    function bar();
}
class Foo implements FooInterface
{
    public function bar()
    {
        return 'i am an object';
    }
}
class NullFoo implements FooInterface
{
    public function bar()
    {
        return 'i am null (but you still can use my interface)';
    }
}

उपयोग:

function bar_my_foo(FooInterface $foo)
{
    if ($foo instanceof NullFoo) {
        // special handling of null values may go here
    }
    echo $foo->bar();
}

bar_my_foo(new NullFoo);

1
यह दृष्टिकोण अक्सर अव्यवहारिक है, क्योंकि 1 वर्ग के बजाय, आपको अब 3. की ​​आवश्यकता है। इसके अलावा, यह लेखक NullFooको अमूर्त तरीकों को ओवरराइड करने के लिए मजबूर करता है , भले ही उनका कोई मतलब न हो (परिभाषा के अनुसार null)।
TheOperator

1
मेरे अनुभव में NullObject पैटर्न व्यावहारिक हो सकता है, यदि आप सामान्य रूप से बहुत सख्त, शास्त्रीय OO तरीके से काम करते हैं। उत्तर में, NullObject पैटर्न का थोड़ा दुरुपयोग किया जाता है, क्योंकि यह विशेष रूप से if (something is null)चेक से बचने के लिए होता है, क्योंकि NullObject का मतलब गैर-मौजूदा मूल्य के सभी व्यवहार को कवर करना है और किसी भी बाहरी सहयोगी को इसमें रुचि रखने की आवश्यकता नहीं है ऑब्जेक्ट नॉन-मौजूदा (शून्य) है या नहीं।
खो दिया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.