Adakah yang bisa menjelaskan perbedaan antara singkatan operator ternary ( ?:
) dan operator penggabungan nol ( ??
) di PHP?
Kapan mereka berperilaku berbeda dan kapan dengan cara yang sama (jika itu terjadi)?
$a ?: $b
VS.
$a ?? $b
Adakah yang bisa menjelaskan perbedaan antara singkatan operator ternary ( ?:
) dan operator penggabungan nol ( ??
) di PHP?
Kapan mereka berperilaku berbeda dan kapan dengan cara yang sama (jika itu terjadi)?
$a ?: $b
VS.
$a ?? $b
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/iCCa0Jalankan di bawah ini pada mode interaktif php (
php -a
pada terminal). Komentar pada setiap baris menunjukkan hasilnya.Jadi ini interpretasi saya:
1. Operator Penggabungan Null -
??
:??
seperti "gerbang" yang hanya memungkinkan NULL masuk .NULL
.??
sama dengan( !isset() || is_null() )
2. Operator Ternary -
?:
?:
seperti gerbang yang memungkinkananything falsy
- termasukNULL
0
,empty string
,NULL
,false
,!isset()
,empty()
.. sesuatu yang berbau falsyecho ($x ? $x : false)
?:
akan menampilkan variabel yangPHP NOTICE
tidak terdefinisi (unset
atau!isset()
)3. Jadi dokter, kapan saya menggunakan
??
dan?:
..?:
kapanempty($x)
cek!empty($x) ? $x : $y
dapat disingkat$x ?: $y
if(!$x) { fn($x); } else { fn($y); }
dapat disingkat menjadifn(($x ?: $y))
??
kapan!isset() || is_null()
cek$object = $object ?? new objClassName();
4. Menumpuk operator ...
Operator Ternary dapat ditumpuk ...
Sumber & kredit untuk kode ini
Ini pada dasarnya adalah urutan:
Operator Null Coalese dapat ditumpuk ...
Ini adalah urutan dari:
Dengan menggunakan susun, saya dapat mempersingkat ini:
Untuk ini:
Keren kan? :-)
sumber
Jika Anda menggunakan operator ternary cara pintas seperti ini, itu akan menyebabkan pemberitahuan jika
$_GET['username']
tidak disetel:Jadi, alih-alih Anda harus melakukan sesuatu seperti ini:
The Operator nol penggabungan setara dengan pernyataan di atas, dan akan kembali 'default' jika
$_GET['username']
tidak diatur ataunull
: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:Nah, itu adalah operator penggabungan yang tepat.
sumber
Perbedaan utama adalah itu
Ternary operator ekspresi
expr1 ?: expr3
kembaliexpr1
jikaexpr1
mengevaluasi keTRUE
tapi di sisi lain Null penggabungan Operator ekspresi(expr1) ?? (expr2)
mengevaluasi keexpr1
jikaexpr1
ini tidakNULL
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 sepertiisset()
.TernaryOperator dibiarkan asosiatif
Operator Penggabungan Null adalah asosiatif yang tepat
Sekarang mari kita jelaskan perbedaan antara dengan contoh:
Operator ternary
(?:)
Operator Penggabungan Null
(??)
Berikut adalah tabel yang menjelaskan perbedaan dan kesamaan antara
'??'
dan?:
sumber
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.
Dan hasilnya:
Tautan: https://3v4l.org/ZBAa1
sumber
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 dariisset($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.sumber
Untuk pemula:
Operator penggabungan nol (??)
Semuanya benar kecuali
null
nilai dan tidak terdefinisi (variabel / array indeks / atribut objek)ex:
ini pada dasarnya memeriksa variabel (indeks array, atribut objek .. dll) ada dan tidak
null
. mirip denganisset
fungsiTulisan 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 tapiNotice
akan melemparkanex
Semoga ini membantu
sumber
Gulir ke bawah pada tautan ini dan lihat bagian, itu memberi Anda contoh komparatif seperti terlihat di bawah:
Namun, tidak disarankan untuk menghubungkan operator karena akan membuat lebih sulit untuk memahami kode ketika membacanya nanti.
Pada dasarnya, menggunakan operator penyatuan akan membuatnya otomatis memeriksa null tidak seperti operator ternary.
sumber
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
,[]
, ...)sumber
$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:Namun dengan menguraikan operator ternary, kita dapat membuat string "" kosong atau kosong seolah-olah itu adalah nol tanpa melempar e_notice:
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 ...sumber
?? null ?:
masalahnya cukup luar biasa, terima kasih tuan. pria pintar.sumber
Null Coalescing operator
melakukan hanya dua tugas: memeriksawhether the variable is set
danwhether it is null
. Lihat contoh berikut:Contoh kode di atas menyatakan bahwa
Null Coalescing operator
memperlakukan variabel yang tidak ada dan variabel yang diatur denganNULL
cara yang sama.Null Coalescing operator
merupakan peningkatan dariternary operator
. Lihat potongan kode berikut yang membandingkan keduanya:Jadi, perbedaan antara keduanya adalah bahwa
Null Coalescing operator
operator dirancang untuk menangani variabel yang tidak terdefinisi lebih baik daripadaternary operator
. Padahal, ituternary operator
adalah singkatan untukif-else
.Null Coalescing operator
tidak dimaksudkan untuk menggantikanternary 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
sumber
isset($_POST['fullname'])
sudah memeriksaNULL
nilai - jadi&& !is_null($_POST['fullname'])
contoh pertama adalah redundanSaat menggunakan superglobals seperti $ _GET atau $ _REQUEST, Anda harus menyadari bahwa itu bisa berupa string kosong. Dalam kasus khusus ini, contoh ini
akan gagal karena nilai $ username sekarang adalah string kosong.
Jadi ketika menggunakan $ _GET atau bahkan $ _REQUEST Anda harus menggunakan operator ternary sebagai gantinya:
Sekarang nilai $ username adalah 'tidak ada' seperti yang diharapkan.
sumber