?: পিএইচপি-তে অপারেটর ('এলভিস অপারেটর')


257

আমি আজ কিছু পিএইচপি কোডে এটি দেখেছি:

$items = $items ?: $this->_handle->result('next', $this->_result, $this);

?:অপারেটরটি এখানে ব্যবহৃত হচ্ছে এর সাথে আমি পরিচিত নই । এটি কোনও ত্রৈমাসিক অপারেটরের মতো দেখায়, তবে ভবিষ্যদ্বাণীটি সত্য কিনা তা মূল্যায়নের জন্য এক্সপ্রেশনটি বাদ দেওয়া হয়েছে। এর মানে কী?

উত্তর:


528

বাম অপারেন্ড সত্যবাদী এবং অন্যথায় ডান অপারেন্ডকে মূল্যায়ন করে ।

সিউডোকোডে,

foo = bar ?: baz;

মোটামুটি সমাধান করে

foo = bar ? bar : baz;

অথবা

if (bar) {
    foo = bar;
} else {
    foo = baz;
}

পার্থক্যটির সাথে যা barকেবল একবার মূল্যায়ন করা হবে।

আপনি fooপোস্ট কোড উদাহরণে প্রদর্শিত হিসাবে "স্ব-চেক" করতে এটি ব্যবহার করতে পারেন :

foo = foo ?: bar;

এই দায়িত্ব অর্পণ করবে barকরার fooযদি fooফাঁকা বা falsey হয়, অন্যথায় এটা ছেড়ে চলে যেতে হবে fooঅপরিবর্তিত।

আরও কয়েকটি উদাহরণ:

<?php
    var_dump(5 ?: 0); // 5
    var_dump(false ?: 0); // 0
    var_dump(null ?: 'foo'); // 'foo'
    var_dump(true ?: 123); // true
    var_dump('rock' ?: 'roll'); // 'rock'
?>

যাইহোক, একে এলভিস অপারেটর বলা হয় ।

এলভিস অপারেটর


11
নিশ্চিত হয়ে নিন যে বন্ধনীতে চলকটি বিদ্যমান রয়েছে, বা আপনি কোনও ত্রুটি বাড়াতে যাচ্ছেন। পিএইচপি কেবল এটির মান nullবা যে কোনও কিছুর অধিকারী হবে না । স্রেফ বলুন '
ড্যানম্যান

20
মজার বিষয়টি হ'ল এই উত্তরটি উইকির নিবন্ধটির সাথে একটি পুনরাবৃত্ত লুপ তৈরি করে, যা "এলভিস অপারেটর" কেন বলা হয় তা পুরোপুরি ব্যাখ্যা করে না।
16'16 এ 16:30 এ দেখছি.মোসিং করছে

41
একটু কম অপারেশন, একটু বেশি এক্সপ্রেশন দয়া করে।
aalaap

2
কেন শুধু একটি ব্যবহার করবেন না ||। তাহলে blah || 'default'?
নোটিডার্ট

10
@ নোটিটার্ট কারণ, জেএসের বিপরীতে যেখানে এটি বামতম সত্যবাদী অপারেন্ডকে ফিরিয়ে দেয়, পিএইচপি-তে ||অপারেটর সর্বদা একটি বুলিয়ান দেয়।
ksadowski

58

দস্তাবেজগুলি দেখুন :

পিএইচপি 5.3 থেকে, টার্নারি অপারেটরের মাঝের অংশটি ছেড়ে দেওয়া সম্ভব। এক্সপ্রেশন expr1 ?: expr3আয় expr1যদি expr1মূল্যায়ন করতে TRUE, এবং expr3অন্যথায়।


10
তাদের একটি নতুন ডক লেখক প্রয়োজন কারণ অনিবার্যভাবে কেউ জিজ্ঞাসা করবে এক্সপ্রেস 2 এর সাথে কী ঘটেছে। আমি শুধু এটি নষ্ট।
জন কে

7
কি হ্যাক? আমি ঠিক এখনই এটি খুঁজে পাচ্ছি, ঠিক পিএইচপি 7 এ আপগ্রেড করার পরে? আমি বছরের পর বছর ধরে এটি ব্যবহার করতে পারতাম!
বাটাল বাটকাস

টিবিএইচ, ডক্সটি সঠিক। যা ঘটেছিল তা expr2হ'ল এটি কেবল অদৃশ্য হয়ে গেছে, এবং মূল্যায়ন করা হয়নি। $this->expensiveComputation() ?: "nope"অভিন্ন নয় $this->expensiveComputation() ? $this->expensiveComputation() : "nope"- expr1 শুধুমাত্র একবার মূল্যায়ন করা হয়।
পিসকভোর

18

অ্যারেগুলির সাথে সাবধানতা অবলম্বন করুন। আমাদের অবশ্যই পরে একটি চেকিং ভেরিয়েবল লিখতে হবে ?, কারণ:

  $params = ['param1' => 'value1',
             'param2' => 'value2',
             'param3' => 'value3',];

  $param1 = isset($params['param1'])?:null;
  $param2 = !empty($params['param2'])?:null;
  $param3 = $params['param3']?:null; // get E_NOTICE, if $params['param3'] eq false

  var_dump($param1,$param2,$param3);
  true // would like to expect `value1`
  true // would like to expect `value2`
  param3 // properly, but problem above

আপডেট করা হয়েছে

আরএফসি থেকে। ভবিষ্যতে (পিএইচপি 7 এ) অপারেটর নুল কোলেসেস অপারেটর এটি করবে, উদাহরণস্বরূপ:

$param1 = $params['param1'] ?? null;
// Equivalent to:  $param1 = isset($params['param1']) ? $params['param1'] : null;

1
এটি প্রশ্নের উত্তর দেয় না, বা এলভিস অপারেটরটি কখন ব্যবহার করতে হবে তা বোঝার চেষ্টা করা কারও পক্ষে কার্যকর নয়।
মার্ক আমেরিকা 11'15

7
@ মার্ক আমেরিকা হুম .. সত্যি? হেল্পফুল? আপনি কি সত্যিই পিএইচপি দিয়ে কাজ করেছেন এবং টের্নারি সহ অ্যারের ওয়ারগুলি অ্যাক্সেস ব্যবহার করতে হাজার হাজার কেস দেখেছেন? ঠিক আছে, আমি পাঠ্যটি "অ্যারেতে সাবধান
থাকি

এত নাল কোলেসেস এবং এলভিস এক?
নবেল খান

7
@ নাবিলখান না! এবং এটি পিএইচপি ইমোতে এলভিস অপারেটরকে কিছুটা বেহুদা করে। এলভিস অপারেটর একটি অভিব্যক্তি মূল্যায়ন করে এবং যদি এটি সত্য হয় তবে এটি এটিকে ফিরিয়ে দেয় অন্যথায় এটি শেষ অংশটি ফেরত দেয়। পিএইচপি কম টাইপ করা হওয়ায় অনেক কিছুই সত্য বা মিথ্যা হবে এবং সম্ভবত জিনিসগুলি আপনার পছন্দ মতো হবে না। উদাহরণস্বরূপ: আপনি কোনও ভেরিয়েবলের জন্য একটি ডিফল্ট মান সেট করতে চান যদি এটি সংজ্ঞায়িত না হয় তবে এলভিস অপারেটর পিএইচপি বলবে যে 0 টি সংজ্ঞায়িত নয়, তবে আপনি হয়ত 0 চান ... তাই পিএইচপি 7 নাল কোলেস অপারেটরটি পাবে , এটি কঠোরভাবে আপনার পরিবর্তনশীল পরীক্ষা করবে কঠোরভাবে, সুতরাং পিএইচপি বলবে যে 0 অপরিজ্ঞাত নয়।
গ্রেগোয়ার ডি

1
@ ফুসকাসফটওয়্যার: ত্রুটি দমনকে এইভাবে ব্যবহার করা আমার অভিজ্ঞতাতে ভাল ধারণা নয়।
টিহেইস

8

আরেকটি গুরুত্বপূর্ণ বিবেচনা: এলভিস অপারেটর জেন্ড ওপচাচি টোকেনাইজেশন প্রক্রিয়া ভঙ্গ করে। আমি এটি হার্ড উপায় খুঁজে পেয়েছি! যদিও এটি পরবর্তী সংস্করণগুলিতে সংশোধন করা যেতে পারে, আমি এই সমস্যাটি পিএইচপি 5.5.38 (অন্তর্নির্মিত জেন্ড অপ্প্যাচি v7.0.6-dev সহ) উপস্থিত রয়েছে তা নিশ্চিত করতে পারি।

যদি আপনি দেখতে পান যে আপনার কিছু ফাইল 'অপসারণ' জেন্ড ওপচেতে ক্যাশে করা হয়েছে, তবে এটির অন্যতম কারণ হতে পারে ... আশা করি এটি সহায়তা করে!


4

হ্যাঁ, এটি পিএইচপি 5.3 এ নতুন। এটি হয় যদি সত্য হিসাবে মূল্যায়ন করা হয় তবে পরীক্ষার অভিব্যক্তির মান, বা যদি এটি ফলস হিসাবে মূল্যায়ন করা হয় তবে বিকল্প মান প্রদান করে।


2
সম্পূর্ণ ভুল / বিভ্রান্তিকর; অপেনডের কোনও বুলিয়ান হওয়ার দরকার নেই। প্রথম বিষয়টি সত্যবাদী কিনা তা গুরুত্বপূর্ণ , তা নয় TRUE
মার্ক আমেরিকা 11'15

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