উত্তর:
যখন আপনার প্রথম যুক্তিটি নাল হয়, মূলত নাল কোয়েলসিং 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'
।
$b = []; var_dump($b['a']['b']['c'] ?? 'default');
বা অবজেক্টস সহ$b = new Foo; var_dump($b->a()->b()->c() ?? 'default');
$a = [];
। দেখুন: 3v4l.org/iCCa0
পিএইচপি ইন্টারেক্টিভ মোডে ( 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"
??
:??
এটি একটি "গেট" এর মতো যা কেবল NULL দিয়ে যেতে দেয় ।NULL
। ??
একই( !isset() || is_null() )
?:
?:
anything falsy
অন্তর্ভুক্ত - এমন একটি গেটের মতো যাNULL
0
, empty string
, NULL
, false
, !isset()
,empty()
.. কিছু falsy গন্ধ পাচ্ছিecho ($x ? $x : false)
?:
ফেলে দেবেPHP NOTICE
unset
!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();
টার্নারি অপারেটর স্ট্যাক করা যেতে পারে ...
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 {}
নাল কোলেস অপারেটরকে স্ট্যাক করা যায় ...
$v = $x ?? $y ?? $z;
এটি একটি ক্রম:
if(!isset($x) || is_null($x) ) {}
else if(!isset($y) || is_null($y) ) {}
else {}
স্ট্যাকিং ব্যবহার করে, আমি এটি ছোট করতে পারি:
if(!isset($_GET['name'])){
if($user_name){
$name = $user_name;
}else {
$name = 'anonymous';
}
} else {
$name = $_GET['name'];
}
এটি:
$name = $_GET['name'] ?? $user_name ?: 'anonymous';
ঠিক আছে তো? :-)
আপনি যদি শর্টকাট টার্নারি অপারেটরটি এভাবে ব্যবহার করেন, $_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';
এখন এটি একটি সঠিক কোয়েলেসিং অপারেটর।
প্রধান পার্থক্য এটি
তিন অপারেটর অভিব্যক্তি expr1 ?: expr3
আয় expr1
যদি expr1
মূল্যায়ণ
TRUE
কিন্তু অন্যদিকে নাল কোয়ালেসিং অপারেটর অভিব্যক্তি (expr1) ?? (expr2)
মূল্যায়ণ করতে expr1
যদি expr1
হয় না NULL
তিন অপারেটর expr1 ?: expr3
যদি বাম দিকে মান একটি নোটিশ নির্গত (expr1)
অস্তিত্ব নেই কিন্তু অন্যদিকে নাল কোয়ালেসিং অপারেটর (expr1) ?? (expr2)
যদি বাম দিকে মান বিশেষ করে, একটি নোটিশ বের না হয় (expr1)
, অস্তিত্ব নেই ঠিক isset()
।
টেরনারিওপ্রেটর বাম সাহাবী
((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? $ ক: $ বি; একটি রিটার্ন বাই রেফারেন্স ফাংশন সুতরাং কাজ করবে না এবং একটি সতর্কতা জারি করা হয়।
ডায়নামিক ডেটা হ্যান্ডলিংয়ের বিষয়টি যখন আসে তখনই দু'জনেই আলাদা আচরণ করে।
ভেরিয়েবলটি ফাঁকা থাকলে ('') নাল কোয়েলসিংটি ভেরিয়েবলটিকে সত্য হিসাবে বিবেচনা করবে তবে শর্টহ্যান্ড ত্রিনিরি অপারেটর তা করবে না। এবং এটি মনে রাখা কিছু।
$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
।
উভয়ই দীর্ঘ অভিব্যক্তির শর্টহ্যান্ড nds
?:
জন্য সংক্ষিপ্ত $a ? $a : $b
। এই অভিব্যক্তি ডলার মূল্যায়ন করবে একটি যদি $ একটি মূল্যায়ন করার 'সত্য' ।
??
জন্য সংক্ষিপ্ত isset($a) ? $a : $b
। এই এক্সপ্রেশনটি মূল্যায়ন করবে যদি set a সেট করা থাকে এবং শূন্য হয় না।
যখন $ a অপরিজ্ঞাত বা নাল হয় তখন তাদের ব্যবহারের ক্ষেত্রে ওভারল্যাপ হয়। যখন ??
und এ অপরিজ্ঞাত হয় তখন কোনও E_NOTICE উত্পাদন করে না, তবে ফলাফলগুলি একই। যখন $ এ নাল হয় ফলাফলটি একই হয়।
নতুনদের জন্য:
নাল কোলেসিং অপারেটর (??)
বাদে সবই সত্য 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"
এটি মূলত ভেরিয়েবলটি পরীক্ষা করে দেখুন (অ্যারে সূচক, অবজেক্ট অ্যাট্রিবিউট .. ইত্যাদি) বিদ্যমান এবং নেই null
। isset
ফাংশন অনুরূপ
টার্নারি অপারেটর শর্টহ্যান্ড (? :)
সমস্ত মিথ্যা জিনিস ( 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: ..
আশাকরি এটা সাহায্য করবে
এই লিঙ্কটিতে নীচে স্ক্রোল করুন এবং বিভাগটি দেখুন, এটি আপনাকে নীচের মত দেখতে তুলনামূলক উদাহরণ দেয়:
<?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';
?>
তবে এটি অপারেটরগুলিকে শৃঙ্খলিত করার পরামর্শ দেওয়া হয় না কারণ এটি পরে পড়ার সময় কোডটি বুঝতে অসুবিধা হয়।
নাল কোয়েলেসিং অপারেটর (??) সিনেট্যাকটিক চিনির হিসাবে যুক্ত করা হয়েছে আইসেট () এর সাথে একত্রে একটি টার্নারি ব্যবহার করার প্রয়োজনের সাধারণ ক্ষেত্রে। এটি উপস্থিত থাকলে এটি প্রথম অপারেন্ডটি ফেরত দেয় এবং শূন্য নয়; অন্যথায় এটি তার দ্বিতীয় অপারেন্ড ফেরত দেয়।
মূলত, কোয়েলসিং অপারেটর ব্যবহার করে এটি টার্নারি অপারেটরের বিপরীতে নলের জন্য স্বয়ংক্রিয় চেক তৈরি করবে।
a || b || c
false || 2
false ?? 2
অন্যান্য উত্তরগুলি গভীর যায় এবং দুর্দান্ত ব্যাখ্যা দেয়। যারা দ্রুত উত্তর খুঁজছেন তাদের জন্য,
$a ?: 'fallback'
হয় $a ? $a : 'fallback'
যখন
$a ?? 'fallback'
হয় $a = isset($a) ? $a : 'fallback'
মূল পার্থক্যটি যখন বাম অপারেটর হয় হয়:
0
, ''
, false
,[]
, ...)$a =
উপরোক্ত সম্প্রসারণে কোনও হওয়া উচিত না ??
। set a এর মান সেট $a ?? 'fallback'
করে না বা পরিবর্তন করে না । (এটি নিছক একটি মান ফেরত দেয়)।
মনে হচ্ছে অনুকূল এবং হয় ব্যবহার করে কনস হয় ??
বা ?:
। ব্যবহারের পক্ষে ?:
হ'ল এটি মিথ্যা এবং নাল এবং একই "" মূল্যায়ন করে। পূর্ববর্তী যুক্তিটি শূন্য থাকলে এটি কোনও 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 নিক্ষেপ করবে না ...
?? null ?:
জিনিসটি দুর্দান্ত দুর্দান্ত, ধন্যবাদ মিঃ চতুর লোক
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.
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'])
প্রথম উদাহরণটিতে যাইহোক রিডানড্যান্ট
G _GET বা $ _REQUEST এর মতো সুপারগ্লোবালগুলি ব্যবহার করার সময় আপনার সচেতন হওয়া উচিত যে এগুলি একটি খালি স্ট্রিং হতে পারে। এই বিশেষ ক্ষেত্রে এই উদাহরণ
$username = $_GET['user'] ?? 'nobody';
ব্যর্থ হবে কারণ $ ব্যবহারকারীর নামটির মান এখন একটি খালি স্ট্রিং।
সুতরাং $ _GET বা এমনকি _RE _REQUEST ব্যবহার করার সময় আপনার পরিবর্তে এরকম তিনটি অপারেটর ব্যবহার করা উচিত:
$username = (!empty($_GET['user'])?$_GET['user']:'nobody';
এখন $ ব্যবহারকারীর নামটির প্রত্যাশা অনুযায়ী 'কেউ নেই'।