হিন্টিং টাইপ ব্যবহার করার সময় নাল আর্গুমেন্ট পাস করতে পারে না


191

নিম্নলিখিত কোড:

<?php

    class Type {

    }

    function foo(Type $t) {

    }

    foo(null);

?>

রান সময় ব্যর্থ:

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

অন্য ভাষার মতো নালিকা কেন পাস করার অনুমতি নেই?

উত্তর:


354

পিএইচপি 7.1 বা আরও নতুন (২ রা ডিসেম্বর ২০১ 2016 প্রকাশিত হয়েছে)

আপনি nullএই সিনট্যাক্সের সাথে সুস্পষ্টভাবে একটি পরিবর্তনশীল ঘোষণা করতে পারেন

function foo(?Type $t) {
}

এর ফলে হবে

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

সুতরাং, আপনি যদি একটি alচ্ছিক যুক্তি চান তবে আপনি কনভেনশনটি অনুসরণ করতে পারেন Type $t = nullতবে আপনার যদি কোনও যুক্তি তৈরি করার দরকার হয় তবে উভয়কেই গ্রহণ করুনnull এবং তার ধরণের উপরের উদাহরণটি অনুসরণ করতে পারেন।

আপনি এখানে আরও পড়তে পারেন ।


পিএইচপি 7.0 বা তার বেশি বয়সী

আপনাকে একটি ডিফল্ট মান যুক্ত করতে হবে

function foo(Type $t = null) {

}

এইভাবে, আপনি এটি একটি নাল মান পাস করতে পারেন।

প্রকারের ঘোষণাপত্র সম্পর্কে ম্যানুয়ালটিতে বিভাগে এটি নথিভুক্ত করা হয়েছে :

NULLযদি প্যারামিটারের ডিফল্ট মান সেট করা থাকে তবে মানগুলি মানতে ঘোষণা করা যেতে পারে NULL


10
তাহলে কেন নাল বস্তুটি নাল নয় ?
পেসারিয়ার

4
বেশিরভাগ ভাষা নালাকে যে কোনও প্রকারের অনুমতি দেয়। এই পরিস্থিতিতে।
হেনরি

24
আমার মতে এটি একটি দুর্বল ভাষা নির্মাণ। ১. অন্যান্য ভাষায় নালটি যে কোনও ধরণের হওয়ার ক্ষমতা রাখে এবং এই ক্ষেত্রে নালকে একটি বৈধ যুক্তি তৈরি করে। 2: পিএইচপি কোনও নালকে অনুমতিযোগ্য বলে উল্লেখ করার জন্য একটি যুক্তির জন্য একটি ডিফল্ট মান ব্যবহার করছে, এটি অস্পষ্ট and
হেনরি

2
আমি @ হেনরির সাথে একমত, এছাড়াও এটি একটি alচ্ছিক পরমের মতো দেখতে প্রয়োজনীয় পরমগুলি পাওয়া খুব অদ্ভুত বলে মনে হচ্ছে।
হিরো

6
আমি @ হেনরির সাথে কেবল ২. এর সাথে একমত হয়েছি 1 সম্পর্কে 1 যে আপনি নালাকে পাশ করতে পারবেন না function foo(Type $t)এটি একটি খুব ভাল জিনিস; দেখতে নাল তথ্যসূত্র: বিলিয়ন ডলারের ভুল
কনস্ট্যান্টিন Galbenu

35

পিএইচপি .1.১ থেকে শুরু করে , ফাংশন রিটার্নের ধরণ এবং পরামিতি উভয় হিসাবে নলযোগ্য প্রকারগুলি উপলব্ধ। প্রকারের ?Tনির্দিষ্ট প্রকারের মান থাকতে পারে T, বা null

সুতরাং, আপনার ফাংশনটি এর মতো দেখতে পেল:

function foo(?Type $t)
{

}

যত তাড়াতাড়ি আপনি পিএইচপি 7.1 এর সাথে কাজ করতে পারবেন, এই স্বরলিপিটি পছন্দ করা উচিত function foo(Type $t = null), কারণ এটি এখনও কলারটিকে প্যারামিটারের জন্য স্পষ্টভাবে একটি যুক্তি নির্দিষ্ট করতে বাধ্য করে $t



7

ইতিমধ্যে উল্লিখিত অন্যান্য উত্তর হিসাবে, আপনি নির্দিষ্ট করে থাকলে এটি কেবলমাত্র সম্ভব null ডিফল্ট মান হিসাবে ।

তবে সবচেয়ে পরিষ্কার টাইপ-সেফ অবজেক্ট ওরিয়েন্টেড সলিউশন হ'ল নালবজেক্ট :

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 প্রয়োজন Also এছাড়াও, এটি লেখককে NullFooবিমূর্ত পদ্ধতি ওভাররাইড করতে বাধ্য করে , যদিও তাদের কোনও অর্থ নেই (সংজ্ঞায়িত করে null)।
TheOperator

1
আমার অভিজ্ঞতায় নুলঅবজেক্ট প্যাটার্নটি ব্যবহারিক হতে পারে, যদি আপনি খুব কঠোর, শাস্ত্রীয় ওও উপায়ে সাধারণভাবে কাজ করেন। উত্তরে ইমো নুলবজেক্ট প্যাটার্নটি কিছুটা আপত্তিজনক, কারণ এটি বিশেষত if (something is null)চেকগুলি এড়ানো বোঝানো হয়েছে , যেহেতু নুলঅবজেক্টটি একটি অ-বিদ্যমান মানের সমস্ত আচরণ coverেকে রাখার জন্য এবং বাইরের কোনও সহযোগীকে কোনও বিষয়ে আগ্রহী হওয়ার প্রয়োজন হবে না অবজেক্ট অ-বিদ্যমান (নাল) বা না।
হারিয়েছে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.