পিএইচপি 7 এ নুলযোগ্য রিটার্নের প্রকারগুলি


159

পিএইচপি 7 রিটার্নের ধরণের ঘোষণার প্রবর্তন করে । যার অর্থ এখন আমি প্রত্যাবর্তন মানটি নির্দিষ্ট শ্রেণি, ইন্টারফেস, অ্যারে, কলযোগ্য বা সদ্য ইঙ্গিতযোগ্য স্কেলার প্রকারগুলির মধ্যে একটি, ফাংশন পরামিতিগুলির পক্ষে সম্ভব হিসাবে এটি চিহ্নিত করতে পারি।

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

প্রায়শই এটি ঘটে থাকে যে কোনও মান সর্বদা উপস্থিত থাকে না এবং আপনি কোনও প্রকারের কিছু বা নালাকে ফিরে আসতে পারেন। আপনি যখন প্যারামিটারগুলি তাদের ডিফল্ট নাল ( DateTime $time = null) এ সেট করে অবিস্মরণীয় করতে পারেন তবে রিটার্নের ধরণের ক্ষেত্রে এটি করার কোনও উপায় বলে মনে হয় না। এটি কি প্রকৃতপক্ষে, বা আমি কোনওভাবে এটি কীভাবে করব তা খুঁজে পাচ্ছি না? এগুলি কার্যকর হয় না:

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

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

8
পিএইচপি 7 এখনও অবনমিত রিটার্নের ধরণের অনুমতি দেবে না, তবে একটি আরএফসি রয়েছে যা এখানে পিএইচপি 7.1 এ সম্বোধন করার লক্ষ্য রাখে । প্রস্তাবিত স্বরলিপিটি তখন হবেfunction returnString(?string $stringNull) : ?string { return $stringNull;}
এলিয়াস ভ্যান ওটেজেম

1
আমি আপাতত আমার অ্যাপ্লিকেশনটিতে ব্যতিক্রমগুলি অপব্যবহার করে নূন্যতা অনুকরণের কাজ শেষ করেছি। আপনি যদি মূর্খ হয়েও ঠিক থাকেন তবে এটি ব্যবহারের জন্য হতে পারে: github.com/JeroenDeDauw/OhMyPhp/blob/master/src/…
জেরোইন ডি দাউ

সম্ভবত পিএইচপি 7 Trowableইন্টারফেসটি (বিশেষত, প্রসারিত করে TypeError) ব্যবহার করার জন্য এটি আরও বোধগম্য হতে পারে
এলিয়াস ভ্যান ওটেজেম

উত্তর:


258

পিএইচপি 7.1 এখন nullable রিটার্ন টাইপ সমর্থন করে । আমি যে আরআফসিটির সাথে প্রথম লিঙ্ক করেছি তারা হ'ল তারা:

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

পুরানো উত্তর:

যেহেতু আমার মন্তব্যটি আসলে প্রশ্নের উত্তর ছিল:

পিএইচপি 7 এখনও অবর্ণনীয় রিটার্ন-প্রকারগুলি সমর্থন করবে না, তবে ঠিক এটির সমাধান করার জন্য একটি আরএফসি আছে , এটি পিএইচপি 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- হ্যাঁ, আরএফসি, "ঠিক এখনও"। আমাকে ভুল বুঝবেন করবেন না - আমি সত্যিই ভারী পিএইচপি ব্যবহারকারী যেহেতু সত্যিই ন্যক্কারজনক PHP3 বার এখন পর্যন্ত কোন ফাঁক, কিন্তু যখন আমি এই সব RFCs তারা 7 প্রত্যাখ্যাত দেখে আমার ছাপ শুধু ছিল "ডব্লিউটিএফ ?!"। ব্যবহারকারীরা এই জগাখিচুড়িটি দেখে এবং পশ্চাদপটে সামঞ্জস্যপূর্ণ উপায়ে এটি পরিষ্কার করতে ইচ্ছুক এবং তারা কেবল "না" পাবে। নোংরা নামকরণ পরিষ্কার পদ্ধতি? nullখুব বিশেষ নাগরিক না হয়েও স্থির ? না, দরকার নেই। যোগ বিকল্প সব উপাদান কেস সংবেদনশীল করতে? নাহ .. এবং তারপরে, অবাক হ'ল লোকেরা পাল্টে।
মার্সিন ওরোলোস্কি

1
@ মার্সিন অরোলোস্কি: একটি অবিচ্ছিন্ন রিটার্ন টাইপ-ইঙ্গিতটি বোঝা যাবে। আমি 7 এর জন্য বেশ কয়েকটি আরএফসি'র অনুসরণ করেছি এবং তাদের বেশিরভাগ অংশকে প্রত্যাখ্যান করে আমি বেশিরভাগ অংশে সম্মত হয়েছি। তারা রানটাইম এবং সংকলক হিসাবে ভাষার উপর এতটা নজর রাখছিল না যে তারা ভাষা নিয়ে ছিলেন। আরএফসি-র কিছু অস্বীকার করা হয়েছিল, কেন তারা এই পরিবর্তনগুলি বাস্তবায়িত করেনি (উদাহরণস্বরূপ হ্রাস করা) কেন তা বেছে নেওয়ার বিষয়টি আলোচনার থ্রেডগুলির মাধ্যমে পড়া মূল্যবান var। একটি মূর্খতা কি এটি পরিবর্তে, তারা একটি খুব ভাল-থেকে-একটি গ্রহণ করেছে (উদাহরণস্বরূপ স্পেসশিপ অপারেটর)
ইলিয়াস ভ্যান ওটেজেম

@ ইলিয়াসভ্যানঅটেজেম ন্যালেবল প্রকারগুলি এখন যথাযথভাবে সমর্থনযোগ্য, কারণ 1 ডিসেম্বর 7.1 প্রকাশিত হয়েছিল।
একাকী দিন

@ একাকী দিন: প্রকৃতপক্ষে এটি করেছে, লিঙ্কটি + আমার উত্তরের নীচে বেসিক উদাহরণ
ইলিয়াস ভ্যান ওটেজেম

মিমি এই উত্তরটি আপডেট করার জন্য একটি ভাল টাইপ! অর্থাত্ ইউনিয়ন প্রকারটি পিএইচপি 7.1
ডেনিস

67

অযোগ্য প্রকারগুলি পিএইচপি 7.1 এ উপলব্ধ।

এটি একটি বাক্য গঠন উদাহরণ:

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

পিএইচপি .1.১ এখন জিএ এবং আপনি পিএইচপি .0.০ থেকে আপগ্রেড করতে পারেন ( আপনাকে যাচাই করতে হবে এমন কয়েকটি পশ্চাতে ব্যতিক্রমী পরিবর্তন রয়েছে )


22
আইএমও এটি "মজাদার" প্রয়োগ না করে রিটার্নের ধরণের ঘোষণাগুলি সরবরাহ করা একটি রসিকতা। "Nullable" বৈশিষ্ট্যটি প্রয়োগ না করা পর্যন্ত রিটার্নের ধরণগুলি অব্যবহার্য।
junas.fi

2
@ junas.fi আইএমও কঠোরভাবে টাইপ করা রিটার্ন মানগুলি সর্বদা সেই ধরণের হওয়া উচিত, একটি নাল রিটার্ন সেই চুক্তিতে ধরা দেয় না এবং নাল মানের কারণটিকে আরও অর্থ প্রদান করে একটি ব্যতিক্রম ছুঁড়ে ফেলা উচিত।
স্টিভ বুজনাস

8
@ স্টিভ বুজনস যদি আপনি কোনও ব্যক্তির প্রতিনিধিত্বকারী কোনও বস্তুতে এজেনশান স্পেস () সম্পর্কে একটি পদ্ধতি বিবেচনা করেন তবে আপনি কীভাবে এমন কোনও ব্যক্তির মডেল করবেন যা আমাদের তার বয়স বলে নি? নাল ফিরে? ফিরবেন 0? নাল শব্দার্থগতভাবে ফিরে আসার অর্থ "আমরা জানি না", যখন 0 শব্দার্থগত অর্থ "ব্যক্তিটি 0 বছর বয়সী"। অতএব আমি getAgeIn ক্লাস ():? Int কে সেরা ডিজাইন হিসাবে যুক্তি দেব। ছোঁড়া ব্যতিক্রম ভাল ... ব্যতিক্রমী মামলার জন্য সংরক্ষণ করা উচিত। বেশিরভাগ সিস্টেমে একজন ব্যক্তির বয়স না জানা ব্যতিক্রমী মামলা হিসাবে বিবেচনা করা উচিত নয়।
junas.fi

@ জুনাস.ফি খুব সত্য, এবং এটি একটি সাধারণ অনুশীলন। যাইহোক, আপনার বাস্তবায়ন এখন সচেতন হওয়া দরকার যে ক্ষেত্রটি naclable এবং স্পষ্টভাবে সেই অনুযায়ী হ্যান্ডেল করা হয়েছে। কোন খুব ভাল এক্স হতে পারে ব্যতীত যখন নাল যা কেবল চেষ্টা / ধরা দিয়ে কার্যকর করা যায়। তদতিরিক্ত, কার্যকরভাবে চালিয়ে যাওয়ার জন্য যদি কারও যদি সেই অবিচ্ছিন্ন ক্ষেত্রের কোনও মান প্রয়োজন হয়, তবে ব্যতিক্রম সম্ভবত একটি ভাল বিকল্প।
স্টিভ বুজোনাস

আমি লক্ষ করেছি যে এই সিনট্যাক্সের কারণে পিএইচপিএমডি প্রচুর ত্রুটি ফেলে। আশা করি তারা শিগগিরই এটি ঠিক করে দিয়েছেন।
টম জোভিট

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.