পিএইচপি টেরিনারি অপারেটর বনাম নাল কোয়েলসিং অপারেটর


341

কেউ কি টার্নারি অপারেটর শর্টহ্যান্ডের মধ্যে পার্থক্য ব্যাখ্যা করতে পারেন (?:?? পিএইচপি-তে ) এবং নাল কোয়েলসিং অপারেটর ( ) এর মধ্যে ?

কখন তারা অন্যরকম আচরণ করে এবং কখন একইভাবে হয় (যদি তা ঘটেও) তবে?

$a ?: $b

বনাম

$a ?? $b

উত্তর:


344

যখন আপনার প্রথম যুক্তিটি নাল হয়, মূলত নাল কোয়েলসিং E_NOTICEযখন আপনার কোনও অপরিজ্ঞাত পরিবর্তনশীল থাকে তখন এগুলি ব্যয় হয় না except পিএইচপি 7.0 মাইগ্রেশন ডক্স এই বলে জানিয়েছে:

নাল কোয়েলেসিং অপারেটর (??) সিনেট্যাকটিক চিনির হিসাবে যুক্ত করা হয়েছে আইসেট () এর সাথে একত্রে একটি টার্নারি ব্যবহার করার প্রয়োজনের সাধারণ ক্ষেত্রে। এটি উপস্থিত থাকলে এবং নুল না থাকলে এটি তার প্রথম অপারেন্ডটি ফেরত দেয়; অন্যথায় এটি তার দ্বিতীয় অপারেন্ড ফেরত দেয়।

এটি প্রদর্শনের জন্য এখানে কয়েকটি উদাহরণ কোড দেওয়া হয়েছে:

<?php

$a = null;

print $a ?? 'b'; // b
print "\n";

print $a ?: 'b'; // b
print "\n";

print $c ?? 'a'; // a
print "\n";

print $c ?: 'a'; // Notice: Undefined variable: c in /in/apAIb on line 14
print "\n";

$b = array('a' => null);

print $b['a'] ?? 'd'; // d
print "\n";

print $b['a'] ?: 'd'; // d
print "\n";

print $b['c'] ?? 'e'; // e
print "\n";

print $b['c'] ?: 'e'; // Notice: Undefined index: c in /in/apAIb on line 33
print "\n";

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

কোডটি কার্যকর করুন: https://3v4l.org/McavC

অবশ্যই, এটি সর্বদা প্রথম যুক্তিটি ধরে নেওয়া যায় null। একবার এটি আর বাতিল হয়ে যায় না, তারপরে আপনি এই পার্থক্যের সাথে শেষ করেন যে ??অপারেটর সর্বদা প্রথম যুক্তিটি ফিরিয়ে দেবে যখন সংক্ষিপ্তটি ?:কেবল তখনই প্রথম যুক্তিটি সত্য হয়, এবং এটি পিএইচপি কীভাবে কোনও বুলিয়ানকে জিনিস টাইপ করে ফেলে তার উপর নির্ভর করে

তাই:

$a = false ?? 'f'; // false
$b = false ?: 'g'; // 'g'

তাহলে $aসমান falseএবং $bসমান হবে 'g'


8
পরামর্শ: আপনি যদি ব্যবহার করে থাকেন ?? এর পরিবর্তে?: তবে তারপরে আপনার কোডটি 7 বছরেরও পুরানো পিএইচপি সংস্করণগুলির সাথে সামঞ্জস্য করার প্রয়োজন হবে (প্রাক্তন প্লাগিনের জন্য), তারপরে আপনি অদলবদল করতে চান ?? isset ($ কিছু) দিয়ে? $ কিছু: code কিছু_ আপনার কোডের যে কোনও জায়গায়। আপনি নোটপ্যাড ++ বা নেডিট (এবং অন্যান্য সম্পাদকদের খুব সহজেই) এটি সন্ধান / প্রতিস্থাপন সরঞ্জামটি ব্যবহার করে, নিয়মিত এক্সপ্রেশন বিকল্পটি নির্বাচন করে এবং ফাইন্ড ক্ষেত্রে সন্নিবেশ করতে পারেন: "* s * (\ এস +) \ s * \? \?" এবং প্রতিস্থাপন ক্ষেত্রে: "isset ($ 1)? $ 1:" উদ্ধৃতি ব্যতীত (নেডিট $ 1 এর পরিবর্তে \ 1 ব্যবহার করে)। তারপরে সব প্রতিস্থাপন করুন।
দামিয়ান সবুজ

14
এটি সঠিক উত্তর তবে সত্যতা পরীক্ষাটি হ'ল প্রধান দ্বিধা এবং আরও জোর দেওয়া উচিত।
mancze

2
@ মাস্টারউডিন আপনার উত্তর নিয়ে সন্তুষ্ট নন। দুটোই এক নয়। বিভিন্ন ফলাফল আছে।
কৌতূহল

1
আপনি যে ব্যবহার করতে পারেন তা লক্ষণীয়? শিকল দিয়ে। উদাহরণস্বরূপ: $b = []; var_dump($b['a']['b']['c'] ?? 'default');বা অবজেক্টস সহ$b = new Foo; var_dump($b->a()->b()->c() ?? 'default');
জ্যাক বি

দয়া করে সচেতন হন যে আচরণটিও এর সাথে আলাদা $a = [];। দেখুন: 3v4l.org/iCCa0
সৌলেভানোউহ

75

পিএইচপি ইন্টারেক্টিভ মোডে ( php -aটার্মিনালে) নীচে রান করুন । প্রতিটি লাইনে মন্তব্য ফলাফল দেখায়।

var_dump (false ?? 'value2');   # bool(false)
var_dump (true  ?? 'value2');   # bool(true)
var_dump (null  ?? 'value2');   # string(6) "value2"
var_dump (''    ?? 'value2');   # string(0) ""
var_dump (0     ?? 'value2');   # int(0)

var_dump (false ?: 'value2');   # string(6) "value2"
var_dump (true  ?: 'value2');   # bool(true)
var_dump (null  ?: 'value2');   # string(6) "value2"
var_dump (''    ?: 'value2');   # string(6) "value2"
var_dump (0     ?: 'value2');   # string(6) "value2"

সুতরাং এটি আমার ব্যাখ্যা:

1. নল কোলেসিং অপারেটর - ??:

  • ?? এটি একটি "গেট" এর মতো যা কেবল NULL দিয়ে যেতে দেয়
  • সুতরাং, এটি সর্বদা প্রথম প্যারামিটারটি দেয় , যদি না প্রথম প্যারামিটারটি ঘটে থাকেNULL
  • এর অর্থ ??একই( !isset() || is_null() )

টেরনারী অপারেটর - ?:

  • ?:anything falsyঅন্তর্ভুক্ত - এমন একটি গেটের মতো যাNULL
  • 0, empty string, NULL, false, !isset(),empty() .. কিছু falsy গন্ধ পাচ্ছি
  • ক্লাসিক টার্নারি অপারেটরের মতো: echo ($x ? $x : false)
  • দ্রষ্টব্য: অপরিশোধিত ( বা ) ভেরিয়েবলগুলিতে ?:ফেলে দেবেPHP NOTICEunset!isset()

৩. সুতরাং ডাক্তার, আমি কখন ব্যবহার করব ??এবং ?:..

  • আমি কেবল রসিকতা করছি - আমি চিকিত্সক নই এবং এটি কেবল একটি ব্যাখ্যা
  • আমি ব্যবহার করব ?: যখন
    • করছেন empty($x) চেক
    • ক্লাসিক টের্নারি অপারেশন এর মতো !empty($x) ? $x : $yসংক্ষিপ্ত করা যেতে পারে$x ?: $y
    • if(!$x) { fn($x); } else { fn($y); } সংক্ষিপ্ত করা যেতে পারে fn(($x ?: $y))
  • আমি ব্যবহার করব ?? যখন
    • আমি একটা করতে চাই !isset() || is_null() চেক
    • উদাহরণস্বরূপ কোন বস্তুর উপস্থিতি আছে কিনা তা পরীক্ষা করুন - $object = $object ?? new objClassName();

৪. স্ট্যাকিং অপারেটরগুলি ...

  1. টার্নারি অপারেটর স্ট্যাক করা যেতে পারে ...

    echo 0 ?: 1 ?: 2 ?: 3; //1
    echo 1 ?: 0 ?: 3 ?: 2; //1
    echo 2 ?: 1 ?: 0 ?: 3; //2
    echo 3 ?: 2 ?: 1 ?: 0; //3
    
    echo 0 ?: 1 ?: 2 ?: 3; //1
    echo 0 ?: 0 ?: 2 ?: 3; //2
    echo 0 ?: 0 ?: 0 ?: 3; //3

    উত্স এবং এই কোডের জন্য ক্রেডিট

    এটি মূলত এর ক্রম:

    if( truthy ) {}
    else if(truthy ) {}
    else if(truthy ) {}
    ..
    else {}
  2. নাল কোলেস অপারেটরকে স্ট্যাক করা যায় ...

    $v = $x ?? $y ?? $z; 

    এটি একটি ক্রম:

    if(!isset($x) || is_null($x) ) {} 
    else if(!isset($y) || is_null($y) ) {}
    else {}
  3. স্ট্যাকিং ব্যবহার করে, আমি এটি ছোট করতে পারি:

    if(!isset($_GET['name'])){
       if($user_name){
          $name = $user_name;
       }else {
          $name = 'anonymous';
       }
    } else { 
       $name = $_GET['name'];
    }

    এটি:

    $name = $_GET['name'] ?? $user_name ?: 'anonymous';

    ঠিক আছে তো? :-)


3
এখনও সেরা উত্তর
ফয়জান আনোয়ার আলী রুপানী

69

আপনি যদি শর্টকাট টার্নারি অপারেটরটি এভাবে ব্যবহার করেন, $_GET['username']সেট না করা থাকলে এটি নোটিশের কারণ ঘটবে :

$val = $_GET['username'] ?: 'default';

সুতরাং পরিবর্তে আপনাকে এই জাতীয় কিছু করতে হবে:

$val = isset($_GET['username']) ? $_GET['username'] : 'default';

নাল কোয়ালেসিং অপারেটর উপরের বিবৃতি সমতূল্য, এবং 'ডিফল্ট' ফিরে আসবে যদি $_GET['username']সেট না করা বা হয় না null:

$val = $_GET['username'] ?? 'default';

মনে রাখবেন এটি সত্যতা যাচাই করে না । এটি সেট করা থাকলে এবং শূন্য না হলেই এটি পরীক্ষা করে।

আপনি এটিও করতে পারেন এবং প্রথম নির্ধারিত (সেট এবং না null) মানটি ফিরে আসবে:

$val = $input1 ?? $input2 ?? $input3 ?? 'default';

এখন এটি একটি সঠিক কোয়েলেসিং অপারেটর।


42

প্রধান পার্থক্য এটি

  1. তিন অপারেটর অভিব্যক্তি expr1 ?: expr3আয় expr1যদি expr1মূল্যায়ণ TRUEকিন্তু অন্যদিকে নাল কোয়ালেসিং অপারেটর অভিব্যক্তি (expr1) ?? (expr2) মূল্যায়ণ করতে expr1যদি expr1হয় না NULL

  2. তিন অপারেটর expr1 ?: expr3 যদি বাম দিকে মান একটি নোটিশ নির্গত (expr1) অস্তিত্ব নেই কিন্তু অন্যদিকে নাল কোয়ালেসিং অপারেটর (expr1) ?? (expr2) যদি বাম দিকে মান বিশেষ করে, একটি নোটিশ বের না হয় (expr1) , অস্তিত্ব নেই ঠিক isset()

  3. টেরনারিওপ্রেটর বাম সাহাবী

    ((true ? 'true' : false) ? 't' : 'f');

    নাল কোলেসিং অপারেটর সঠিক সাহসী

    ($a ?? ($b ?? $c));

এখন উদাহরণস্বরূপ পার্থক্য ব্যাখ্যা করতে দিন:

টার্নারি অপারেটর (?:)

$x='';
$value=($x)?:'default';
var_dump($value);

// The above is identical to this if/else statement
if($x){
  $value=$x;
}
else{
  $value='default';
}
var_dump($value);

নাল কোলেসিং অপারেটর (??)

$value=($x)??'default';
var_dump($value);

// The above is identical to this if/else statement
if(isset($x)){
  $value=$x;
}
else{
  $value='default';
}
var_dump($value);

এখানে সারণি পার্থক্য এবং মধ্যে মিল ব্যাখ্যা হয় '??'এবং?:

এখানে চিত্র বর্ণনা লিখুন

বিশেষ দ্রষ্টব্য: নাল কোলেসিং অপারেটর এবং টেরিনারি অপারেটর একটি অভিব্যক্তি এবং এটি কোনও ভেরিয়েবলের জন্য মূল্যায়ন করে না, তবে একটি অভিব্যক্তির ফলাফলের জন্য। আপনি যদি রেফারেন্স দ্বারা কোনও ভেরিয়েবল ফিরিয়ে দিতে চান তবে এটি জেনে রাখা গুরুত্বপূর্ণ। বিবৃতি ফিরে আসে $ ফু ?? বার $; এবং ফেরৎ $ var == 42? $ ক: $ বি; একটি রিটার্ন বাই রেফারেন্স ফাংশন সুতরাং কাজ করবে না এবং একটি সতর্কতা জারি করা হয়।


15

ডায়নামিক ডেটা হ্যান্ডলিংয়ের বিষয়টি যখন আসে তখনই দু'জনেই আলাদা আচরণ করে।

ভেরিয়েবলটি ফাঁকা থাকলে ('') নাল কোয়েলসিংটি ভেরিয়েবলটিকে সত্য হিসাবে বিবেচনা করবে তবে শর্টহ্যান্ড ত্রিনিরি অপারেটর তা করবে না। এবং এটি মনে রাখা কিছু।

$a = NULL;
$c = '';

print $a ?? '1b';
print "\n";

print $a ?: '2b';
print "\n";

print $c ?? '1d';
print "\n";

print $c ?: '2d';
print "\n";

print $e ?? '1f';
print "\n";

print $e ?: '2f';

এবং আউটপুট:

1b
2b

2d
1f

Notice: Undefined variable: e in /in/ZBAa1 on line 21
2f

লিঙ্ক: https://3v4l.org/ZBAa1


এটি পিএইচপি-র পক্ষে স্পষ্টভাবে পাল্টা স্বজ্ঞাত, যেখানে খালি স্ট্রিংটি সাধারণত মিথ্যা বলে বিবেচিত হয়। তবুও এটি ডক্সগুলিতে স্পষ্টভাবে নির্দেশিত হয়েছে ??: It returns its first operand if it exists and is not NULL; otherwise it returns its second operand
সাইমন

12

উভয়ই দীর্ঘ অভিব্যক্তির শর্টহ্যান্ড nds

?:জন্য সংক্ষিপ্ত $a ? $a : $b। এই অভিব্যক্তি ডলার মূল্যায়ন করবে একটি যদি $ একটি মূল্যায়ন করার 'সত্য'

?? জন্য সংক্ষিপ্ত isset($a) ? $a : $b । এই এক্সপ্রেশনটি মূল্যায়ন করবে যদি set a সেট করা থাকে এবং শূন্য হয় না।

যখন $ a অপরিজ্ঞাত বা নাল হয় তখন তাদের ব্যবহারের ক্ষেত্রে ওভারল্যাপ হয়। যখন ??und এ অপরিজ্ঞাত হয় তখন কোনও E_NOTICE উত্পাদন করে না, তবে ফলাফলগুলি একই। যখন $ এ নাল হয় ফলাফলটি একই হয়।


5

নতুনদের জন্য:

নাল কোলেসিং অপারেটর (??)

বাদে সবই সত্য nullমানগুলি এবং অপরিশোধিত (পরিবর্তনশীল / অ্যারে সূচক / অবজেক্ট বৈশিষ্ট্য)

উদা:

$array = [];
$object = new stdClass();

var_export (false ?? 'second');                           # false
var_export (true  ?? 'second');                           # true
var_export (null  ?? 'second');                           # 'second'
var_export (''    ?? 'second');                           # ""
var_export ('some text'    ?? 'second');                  # "some text"
var_export (0     ?? 'second');                           # 0
var_export ($undefinedVarible ?? 'second');               # "second"
var_export ($array['undefined_index'] ?? 'second');       # "second"
var_export ($object->undefinedAttribute ?? 'second');     # "second"

এটি মূলত ভেরিয়েবলটি পরীক্ষা করে দেখুন (অ্যারে সূচক, অবজেক্ট অ্যাট্রিবিউট .. ইত্যাদি) বিদ্যমান এবং নেই nullissetফাংশন অনুরূপ

টার্নারি অপারেটর শর্টহ্যান্ড (? :)

সমস্ত মিথ্যা জিনিস ( false, null, 0, খালি STRING) মিথ্যা হিসাবে আসা হয়, কিন্তু যদি এটি একটি অনির্দিষ্ট হচ্ছে এটি মিথ্যা হিসাবে আসা কিন্তুNotice নিক্ষেপ করা হবে

প্রাক্তন

$array = [];
$object = new stdClass();

var_export (false ?: 'second');                           # "second"
var_export (true  ?: 'second');                           # true
var_export (null  ?: 'second');                           # "second"
var_export (''    ?: 'second');                           # "second"
var_export ('some text'    ?? 'second');                  # "some text"
var_export (0     ?: 'second');                           # "second"
var_export ($undefinedVarible ?: 'second');               # "second" Notice: Undefined variable: ..
var_export ($array['undefined_index'] ?: 'second');       # "second" Notice: Undefined index: ..
var_export ($object->undefinedAttribute ?: 'second');     # "Notice: Undefined index: ..

আশাকরি এটা সাহায্য করবে


4

এই লিঙ্কটিতে নীচে স্ক্রোল করুন এবং বিভাগটি দেখুন, এটি আপনাকে নীচের মত দেখতে তুলনামূলক উদাহরণ দেয়:

<?php
/** Fetches the value of $_GET['user'] and returns 'nobody' if it does not exist. **/
$username = $_GET['user'] ?? 'nobody';
/** This is equivalent to: **/
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

/** Coalescing can be chained: this will return the first defined value out of $_GET['user'], $_POST['user'], and 'nobody'. **/
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
?>

তবে এটি অপারেটরগুলিকে শৃঙ্খলিত করার পরামর্শ দেওয়া হয় না কারণ এটি পরে পড়ার সময় কোডটি বুঝতে অসুবিধা হয়।

নাল কোয়েলেসিং অপারেটর (??) সিনেট্যাকটিক চিনির হিসাবে যুক্ত করা হয়েছে আইসেট () এর সাথে একত্রে একটি টার্নারি ব্যবহার করার প্রয়োজনের সাধারণ ক্ষেত্রে। এটি উপস্থিত থাকলে এটি প্রথম অপারেন্ডটি ফেরত দেয় এবং শূন্য নয়; অন্যথায় এটি তার দ্বিতীয় অপারেন্ড ফেরত দেয়।

মূলত, কোয়েলসিং অপারেটর ব্যবহার করে এটি টার্নারি অপারেটরের বিপরীতে নলের জন্য স্বয়ংক্রিয় চেক তৈরি করবে।


1
শৃঙ্খলাবদ্ধতা বিবেচনা করবেন না ... শৃঙ্খলাবদ্ধ অঞ্চলগুলি পড়ার / বোঝা যেমনই কঠিন
মার্ক বাকের

7
@ মারকবেকার শৃঙ্খলিত টেরিনারিগুলি বোঝা শক্ত কারণ পিএইচপি ত্রৈমাসিক সহযোগিতা ভেঙে দিয়েছে। এটি কোলেসেস অপারেটরের ক্ষেত্রে প্রযোজ্য নয় এবং imho শৃঙ্খলিত coalesce পুরোপুরি বোধগম্য।
নিকিসি

7
আমি একমত নই নাল কোলেসকে শৃঙ্খলাবদ্ধ করা একটি দুর্দান্ত বৈশিষ্ট্য এবং আপনি যদি অপারেটরটি বুঝতে পারেন তবে এটি পড়তে অসুবিধা হয় না। এটি সাধারণত জাভাস্ক্রিপ্টে ব্যবহৃত হয় এবং পিএইচপি-তে লোকেরা এতে স্বাচ্ছন্দ্য বোধ করলে চেইন ব্যবহার না করার জন্য এই কলটি থামানো উচিত। টেইনারিগুলি চেইন পড়া খুব কঠিন, তবে নাল কোলেসেস সহজ। আপনি বাম থেকে ডানে পড়ার সাথে সাথে এটি তালিকাভুক্ত করে যা পরবর্তী মানটি ব্যবহার করা উচিত।
earl3s

2
এটি a || b || cfalse || 2false ?? 2
জেএসের

1
আমি আপনার এবং অন্যদের সাথে চেইন ব্যবহার না করার বিষয়ে একমত নই। এটি বলার মতো যে কখনও লুপগুলির জন্য ব্যবহার করবেন না কারণ সম্ভবত সেগুলি বুঝতে পারে না। বিকাশকারী / কোডাররা কোডিং মান এবং তারা যেগুলি বোঝেন সেগুলি ব্যবহারের জন্য নিখুঁতভাবে নিখুঁত, অন্যরা তা না জানায়ও। ব্যক্তিগতভাবে, আমি শৃঙ্খলাবদ্ধ Coalescing দেখতে বিবৃতি স্যুইচ হিসাবে অনুরূপ। এটি পাওয়া যায় এমন প্রথম মানটি (সেট) এবং কিছু না পাওয়া গেলে শেষ মান দেয়।
কুর্ডপৃষ্ঠা

3

অন্যান্য উত্তরগুলি গভীর যায় এবং দুর্দান্ত ব্যাখ্যা দেয়। যারা দ্রুত উত্তর খুঁজছেন তাদের জন্য,

$a ?: 'fallback' হয় $a ? $a : 'fallback'

যখন

$a ?? 'fallback' হয় $a = isset($a) ? $a : 'fallback'


মূল পার্থক্যটি যখন বাম অপারেটর হয় হয়:

  • একজন falsy মান নাল নয় ( 0, '', false,[] , ...)
  • একটি অপরিবর্তিত ভেরিয়েবল

$a =উপরোক্ত সম্প্রসারণে কোনও হওয়া উচিত না ??। set a এর মান সেট $a ?? 'fallback' করে না বা পরিবর্তন করে না । (এটি নিছক একটি মান ফেরত দেয়)।
ডাইন

2

মনে হচ্ছে অনুকূল এবং হয় ব্যবহার করে কনস হয় ??বা ?:। ব্যবহারের পক্ষে ?:হ'ল এটি মিথ্যা এবং নাল এবং একই "" মূল্যায়ন করে। পূর্ববর্তী যুক্তিটি শূন্য থাকলে এটি কোনও E_NOTICE কে প্রতিবেদন করে The সঙ্গে ??প্রো কোন E_NOTICE নেই, কিন্তু বিরূদ্ধে এটি মিথ্যা এবং নাল একই মূল্যায়ন না। আমার অভিজ্ঞতায় আমি দেখেছি লোকেরা নাল এবং মিথ্যা বিনিময়যোগ্যভাবে ব্যবহার শুরু করে তবে শেষ পর্যন্ত তারা নাল বা মিথ্যা ব্যবহারের সাথে সঙ্গতিপূর্ণ হওয়ার জন্য তাদের কোডটি সংশোধন করে, তবে উভয়ই নয়। একটি বিকল্প হ'ল আরও বিস্তৃত বার্ষিক অবস্থা তৈরি করা:(isset($something) or !$something) ? $something : $something_else

??অপারেটরটি নাল এবং মিথ্যা উভয়ই ব্যবহারের পার্থক্যের উদাহরণ নীচে দেওয়া হয়েছে :

$false = null;
$var = $false ?? "true";
echo $var . "---<br>";//returns: true---

$false = false;
$var = $false ?? "true";
echo $var . "---<br>"; //returns: ---

তবে টার্নারি অপারেটরটির বিশদ বিবরণ দিয়ে আমরা একটি মিথ্যা বা খালি স্ট্রিংটি এমনভাবে আচরণ করতে পারি যে এটি কোনও ই-নোটস নিক্ষেপ না করে শূন্য হয়ে গেছে:

$false = null;
$var = (isset($false) or !$false) ? $false : "true";
echo $var . "---<br>";//returns: ---

$false = false;
$var = (isset($false) or !$false) ? $false : "true";
echo $var . "---<br>";//returns: ---

$false = "";
$var = (isset($false) or !$false) ? $false : "true";
echo $var . "---<br>";//returns: ---

$false = true;
$var = (isset($false) or !$false) ? $false : "true";
echo $var . "---<br>";//returns: 1---

ব্যক্তিগতভাবে, আমি ভাবি যে পিএইচপি-র ভবিষ্যতের রেভটিতে অন্য নতুন অপারেটর অন্তর্ভুক্ত রয়েছে: :?এটি উপরের সিনট্যাক্সটিকে প্রতিস্থাপন করেছে। যেমন: // $var = $false :? "true";এই বাক্য গঠনটি নাল, মিথ্যা এবং সমান "" মূল্যায়ন করবে এবং কোনও E_NOTICE নিক্ষেপ করবে না ...


3
আপনি $ var = $ মিথ্যা ব্যবহার করতে পারেন ?? নাল?: "স্ট্রিং ফাঁকা / মিথ্যা / নাল / অপরিজ্ঞাত";
RedSparr0w

ওহো ... ?? null ?:জিনিসটি দুর্দান্ত দুর্দান্ত, ধন্যবাদ মিঃ চতুর লোক
ব্লেইন ল্যাফ্রিনিরে

1
class a
{
    public $a = 'aaa';
}

$a = new a();

echo $a->a;  // Writes 'aaa'
echo $a->b;  // Notice: Undefined property: a::$b

echo $a->a ?? '$a->a does not exists';  // Writes 'aaa'

// Does not throw an error although $a->b does not exist.
echo $a->b ?? '$a->b does not exist.';  // Writes $a->b does not exist.

// Does not throw an error although $a->b and also $a->b->c does not exist.
echo $a->b->c ?? '$a->b->c does not exist.';  // Writes $a->b->c does not exist.

0

Null Coalescing operatorমাত্র দুটি কার্য সম্পাদন করে: এটি পরীক্ষা করে whether the variable is setএবং whether it is null। নিম্নলিখিত উদাহরণটি দেখুন:

<?php
# case 1:
$greeting = 'Hola';
echo $greeting ?? 'Hi There'; # outputs: 'Hola'

# case 2:
$greeting = null;
echo $greeting ?? 'Hi There'; # outputs: 'Hi There'

# case 3:
unset($greeting);
echo $greeting ?? 'Hi There'; # outputs: 'Hi There'

উপরের কোড উদাহরণটিতে বলা হয়েছে যে Null Coalescing operatorএকটি অ-বিদ্যমান ভেরিয়েবল এবং একটি ভেরিয়েবলের সাথে আচরণ করে যা NULLএকইভাবে সেট করা আছে।

Null Coalescing operatorউপর একটি উন্নতি ternary operator। দুটি কোডের তুলনা করে নীচের কোড স্নিপেটটি দেখুন:

<?php /* example: checking for the $_POST field that goes by the name of 'fullname'*/
# in ternary operator
echo "Welcome ", (isset($_POST['fullname']) && !is_null($_POST['fullname']) ? $_POST['fullname'] : 'Mr. Whosoever.'); # outputs: Welcome Mr. Whosoever.
# in null coalecing operator
echo "Welcome ", ($_POST['fullname'] ?? 'Mr. Whosoever.'); # outputs: Welcome Mr. Whosoever.

সুতরাং, উভয়ের মধ্যে পার্থক্য হ'ল Null Coalescing operatorঅপারেটরটি অপরিজ্ঞাত ভেরিয়েবলগুলি হ্যান্ডেল করার জন্য ডিজাইন করা হয়েছে ternary operator। যদিও, এটি ternary operatorএকটি সংক্ষিপ্তকরণ if-else

Null Coalescing operatorপ্রতিস্থাপনের উদ্দেশ্যে নয় ternary operator, তবে কিছু ব্যবহারের ক্ষেত্রে যেমন উপরের উদাহরণ হিসাবে এটি আপনাকে কম ঝামেলা সহ পরিষ্কার কোড লিখতে দেয়।

ক্রেডিট: http://dwellupper.io/post/6/php7-null-coalescing-operator-usage- এবং- উদাহরণ


isset($_POST['fullname'])ইতিমধ্যে NULLমানগুলির জন্য পরীক্ষা করে - তাই && !is_null($_POST['fullname'])প্রথম উদাহরণটিতে যাইহোক রিডানড্যান্ট
ইয়ারন ইউ

0

G _GET বা $ _REQUEST এর মতো সুপারগ্লোবালগুলি ব্যবহার করার সময় আপনার সচেতন হওয়া উচিত যে এগুলি একটি খালি স্ট্রিং হতে পারে। এই বিশেষ ক্ষেত্রে এই উদাহরণ

$username = $_GET['user'] ?? 'nobody';

ব্যর্থ হবে কারণ $ ব্যবহারকারীর নামটির মান এখন একটি খালি স্ট্রিং।

সুতরাং $ _GET বা এমনকি _RE _REQUEST ব্যবহার করার সময় আপনার পরিবর্তে এরকম তিনটি অপারেটর ব্যবহার করা উচিত:

$username = (!empty($_GET['user'])?$_GET['user']:'nobody';

এখন $ ব্যবহারকারীর নামটির প্রত্যাশা অনুযায়ী 'কেউ নেই'।


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