Jawaban:
Ketika argumen pertama Anda adalah nol, mereka pada dasarnya sama kecuali bahwa penggabungan nol tidak akan menghasilkan E_NOTICE
ketika Anda memiliki variabel yang tidak ditentukan. The PHP 7.0 docs migrasi telah mengatakan ini:
Operator penggabungan nol (??) telah ditambahkan sebagai gula sintaksis untuk kasus umum yang memerlukan penggunaan terner dalam hubungannya dengan isset (). Ini mengembalikan operan pertamanya jika ada dan bukan NULL; selain itu mengembalikan operan keduanya.
Berikut beberapa contoh kode untuk menunjukkan ini:
<?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";
Garis-garis yang memiliki pemberitahuan adalah yang saya gunakan operator steno singkat sebagai lawan dari operator penggabungan nol. Namun, bahkan dengan pemberitahuan tersebut, PHP akan memberikan respons yang sama kembali.
Jalankan kode: https://3v4l.org/McavC
Tentu saja, ini selalu dengan asumsi argumen pertama null
. Setelah itu tidak lagi nol, maka Anda berakhir dengan perbedaan dalam hal ??
operator akan selalu mengembalikan argumen pertama sedangkan ?:
steno hanya akan jika argumen pertama benar, dan itu bergantung pada bagaimana PHP akan mengetikkan melemparkan hal-hal ke boolean .
Begitu:
$a = false ?? 'f'; // false
$b = false ?: 'g'; // 'g'
maka $a
akan sama dengan false
dan $b
sama dengan 'g'
.
$b = []; var_dump($b['a']['b']['c'] ?? 'default');
atau dengan benda$b = new Foo; var_dump($b->a()->b()->c() ?? 'default');
$a = [];
. Lihat: 3v4l.org/iCCa0
Jalankan di bawah ini pada mode interaktif php ( php -a
pada terminal). Komentar pada setiap baris menunjukkan hasilnya.
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"
??
:??
seperti "gerbang" yang hanya memungkinkan NULL masuk .NULL
. ??
sama dengan( !isset() || is_null() )
?:
?:
seperti gerbang yang memungkinkan anything falsy
- termasukNULL
0
, empty string
, NULL
, false
, !isset()
, empty()
.. sesuatu yang berbau falsyecho ($x ? $x : false)
?:
akan menampilkan variabel yang PHP NOTICE
tidak terdefinisi ( unset
atau !isset()
)??
dan ?:
..?:
kapan
empty($x)
cek!empty($x) ? $x : $y
dapat disingkat$x ?: $y
if(!$x) { fn($x); } else { fn($y); }
dapat disingkat menjadi fn(($x ?: $y))
??
kapan
!isset() || is_null()
cek$object = $object ?? new objClassName();
Operator Ternary dapat ditumpuk ...
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
Sumber & kredit untuk kode ini
Ini pada dasarnya adalah urutan:
if( truthy ) {}
else if(truthy ) {}
else if(truthy ) {}
..
else {}
Operator Null Coalese dapat ditumpuk ...
$v = $x ?? $y ?? $z;
Ini adalah urutan dari:
if(!isset($x) || is_null($x) ) {}
else if(!isset($y) || is_null($y) ) {}
else {}
Dengan menggunakan susun, saya dapat mempersingkat ini:
if(!isset($_GET['name'])){
if($user_name){
$name = $user_name;
}else {
$name = 'anonymous';
}
} else {
$name = $_GET['name'];
}
Untuk ini:
$name = $_GET['name'] ?? $user_name ?: 'anonymous';
Keren kan? :-)
Jika Anda menggunakan operator ternary cara pintas seperti ini, itu akan menyebabkan pemberitahuan jika $_GET['username']
tidak disetel:
$val = $_GET['username'] ?: 'default';
Jadi, alih-alih Anda harus melakukan sesuatu seperti ini:
$val = isset($_GET['username']) ? $_GET['username'] : 'default';
The Operator nol penggabungan setara dengan pernyataan di atas, dan akan kembali 'default' jika $_GET['username']
tidak diatur atau null
:
$val = $_GET['username'] ?? 'default';
Perhatikan bahwa itu tidak memeriksa kebenaran . Ia memeriksa hanya jika diatur dan bukan nol.
Anda juga dapat melakukan ini, dan nilai yang ditentukan (ditetapkan dan tidak null
) akan dikembalikan:
$val = $input1 ?? $input2 ?? $input3 ?? 'default';
Nah, itu adalah operator penggabungan yang tepat.
Perbedaan utama adalah itu
Ternary operator ekspresi expr1 ?: expr3
kembali expr1
jika expr1
mengevaluasi ke
TRUE
tapi di sisi lain Null penggabungan Operator ekspresi (expr1) ?? (expr2)
mengevaluasi ke expr1
jika expr1
ini tidak NULL
Operator Ternary expr1 ?: expr3
mengeluarkan pemberitahuan jika nilai sisi kiri (expr1)
tidak ada tetapi di sisi lain Operator Penggabungan Null (expr1) ?? (expr2)
Secara khusus, tidak memancarkan pemberitahuan jika nilai sisi kiri (expr1)
tidak ada, sama seperti isset()
.
TernaryOperator dibiarkan asosiatif
((true ? 'true' : false) ? 't' : 'f');
Operator Penggabungan Null adalah asosiatif yang tepat
($a ?? ($b ?? $c));
Sekarang mari kita jelaskan perbedaan antara dengan contoh:
Operator ternary (?:)
$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);
Operator Penggabungan Null (??)
$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);
Berikut adalah tabel yang menjelaskan perbedaan dan kesamaan antara '??'
dan?:
Catatan Khusus: operator penggabungan nol dan operator ternary adalah ekspresi, dan itu tidak mengevaluasi ke variabel, tetapi untuk hasil ekspresi. Ini penting untuk diketahui jika Anda ingin mengembalikan variabel dengan referensi. Pernyataan mengembalikan $ foo ?? $ bar; dan mengembalikan $ var == 42? $ a: $ b; karena itu fungsi pengembalian-oleh-referensi tidak akan berfungsi dan peringatan dikeluarkan.
Keduanya berperilaku berbeda dalam hal penanganan data dinamis.
Jika variabel kosong ('') penggabungan nol akan memperlakukan variabel sebagai true tetapi operator ternary steno tidak akan. Dan itu sesuatu yang ada dalam pikiran.
$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';
Dan hasilnya:
1b
2b
2d
1f
Notice: Undefined variable: e in /in/ZBAa1 on line 21
2f
Tautan: https://3v4l.org/ZBAa1
It returns its first operand if it exists and is not NULL; otherwise it returns its second operand
.
Keduanya adalah singkatan untuk ekspresi yang lebih panjang.
?:
kependekan dari $a ? $a : $b
. Ekspresi ini akan mengevaluasi ke $ a jika $ a mengevaluasi ke TRUE .
??
kependekan dari isset($a) ? $a : $b
. Ekspresi ini akan mengevaluasi ke $ a jika $ a diatur dan bukan nol.
Kasus penggunaannya tumpang tindih ketika $ a tidak terdefinisi atau nol. Ketika $ a tidak terdefinisi ??
tidak akan menghasilkan E_NOTICE, tetapi hasilnya sama. Ketika $ a adalah null hasilnya sama.
Untuk pemula:
Operator penggabungan nol (??)
Semuanya benar kecuali null
nilai dan tidak terdefinisi (variabel / array indeks / atribut objek)
ex:
$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"
ini pada dasarnya memeriksa variabel (indeks array, atribut objek .. dll) ada dan tidak null
. mirip dengan isset
fungsi
Tulisan singkat operator ternary (? :)
setiap hal-hal yang salah ( false
, null
, 0
, string kosong) yang datang sebagai palsu, tetapi jika itu sebuah terdefinisi juga datang sebagai palsu tapi Notice
akan melemparkan
ex
$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: ..
Semoga ini membantu
Gulir ke bawah pada tautan ini dan lihat bagian, itu memberi Anda contoh komparatif seperti terlihat di bawah:
<?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';
?>
Namun, tidak disarankan untuk menghubungkan operator karena akan membuat lebih sulit untuk memahami kode ketika membacanya nanti.
Operator penggabungan nol (??) telah ditambahkan sebagai gula sintaksis untuk kasus umum yang memerlukan penggunaan terner dalam hubungannya dengan isset (). Ini mengembalikan operan pertamanya jika ada dan bukan NULL; selain itu mengembalikan operan keduanya.
Pada dasarnya, menggunakan operator penyatuan akan membuatnya otomatis memeriksa null tidak seperti operator ternary.
a || b || c
pola umum dalam JS, kecuali PHP dapat digunakan untuk boolean ( false || 2
dalam JS adalah 2; false ?? 2
dalam PHP salah)
Jawaban yang lain masuk lebih dalam dan memberikan penjelasan yang bagus. Bagi mereka yang mencari jawaban cepat,
$a ?: 'fallback'
adalah $a ? $a : 'fallback'
sementara
$a ?? 'fallback'
adalah $a = isset($a) ? $a : 'fallback'
Perbedaan utama adalah ketika operator kiri adalah:
0
, ''
, false
, []
, ...)$a =
ekspansi di atas ??
. $a ?? 'fallback'
tidak menetapkan atau mengubah nilai $ a. (Ini hanya mengembalikan nilai).
Tampaknya ada pro dan kontra untuk menggunakan salah satu ??
atau ?:
. Pro untuk menggunakan ?:
adalah bahwa ia mengevaluasi false dan null dan "" sama. Yang salah adalah bahwa ia melaporkan E_NOTICE jika argumen sebelumnya adalah nol. Dengan ??
pro adalah bahwa tidak ada E_NOTICE, tetapi masalahnya adalah tidak mengevaluasi false dan null sama. Dalam pengalaman saya, saya telah melihat orang-orang mulai menggunakan null dan false secara bergantian tetapi kemudian mereka akhirnya memodifikasi kode mereka agar konsisten dengan menggunakan null atau false, tetapi tidak keduanya. Sebuah alternatif adalah untuk menciptakan kondisi terner yang lebih rumit: (isset($something) or !$something) ? $something : $something_else
.
Berikut ini adalah contoh perbedaan penggunaan ??
operator menggunakan null dan false:
$false = null;
$var = $false ?? "true";
echo $var . "---<br>";//returns: true---
$false = false;
$var = $false ?? "true";
echo $var . "---<br>"; //returns: ---
Namun dengan menguraikan operator ternary, kita dapat membuat string "" kosong atau kosong seolah-olah itu adalah nol tanpa melempar e_notice:
$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---
Secara pribadi, saya pikir akan sangat baik jika rev PHP masa depan termasuk operator baru: :?
yang menggantikan sintaks di atas. yaitu:
// $var = $false :? "true";
Sintaks itu akan mengevaluasi null, false, dan "" sama-sama dan tidak melempar E_NOTICE ...
?? null ?:
masalahnya cukup luar biasa, terima kasih tuan. pria pintar.
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
melakukan hanya dua tugas: memeriksa whether the variable is set
dan whether it is null
. Lihat contoh berikut:
<?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'
Contoh kode di atas menyatakan bahwa Null Coalescing operator
memperlakukan variabel yang tidak ada dan variabel yang diatur dengan NULL
cara yang sama.
Null Coalescing operator
merupakan peningkatan dari ternary operator
. Lihat potongan kode berikut yang membandingkan keduanya:
<?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.
Jadi, perbedaan antara keduanya adalah bahwa Null Coalescing operator
operator dirancang untuk menangani variabel yang tidak terdefinisi lebih baik daripada ternary operator
. Padahal, itu ternary operator
adalah singkatan untuk if-else
.
Null Coalescing operator
tidak dimaksudkan untuk menggantikan ternary operator
, tetapi dalam beberapa kasus penggunaan seperti pada contoh di atas, ini memungkinkan Anda untuk menulis kode bersih dengan lebih mudah.
Kredit: http://dwellupper.io/post/6/php7-null-coalescing-operator-usage-and-examples
isset($_POST['fullname'])
sudah memeriksa NULL
nilai - jadi && !is_null($_POST['fullname'])
contoh pertama adalah redundan
Saat menggunakan superglobals seperti $ _GET atau $ _REQUEST, Anda harus menyadari bahwa itu bisa berupa string kosong. Dalam kasus khusus ini, contoh ini
$username = $_GET['user'] ?? 'nobody';
akan gagal karena nilai $ username sekarang adalah string kosong.
Jadi ketika menggunakan $ _GET atau bahkan $ _REQUEST Anda harus menggunakan operator ternary sebagai gantinya:
$username = (!empty($_GET['user'])?$_GET['user']:'nobody';
Sekarang nilai $ username adalah 'tidak ada' seperti yang diharapkan.