Pernyataan bersyarat. Operator logika dalam PHP Operasi logika dalam suatu kondisi

PHP mendukung operator logika standar AND dan && , OR dan || , ! (tidak) dan XOR . Operator logika memungkinkan Anda membandingkan hasil dua operan (nilai atau ekspresi) untuk menentukan apakah salah satu atau keduanya mengembalikan nilai benar atau salah dan memilih apakah akan terus menjalankan skrip berdasarkan nilai yang dikembalikan. Seperti operator perbandingan, operator logika mengembalikan satu nilai Boolean - benar atau salah, bergantung pada nilai di kedua sisi operator.

Logis ATAU (ATAU dan ||)

Operator logika OR dinotasikan sebagai OR atau || . Ia melakukan operasi logika OR pada dua operan. Jika salah satu atau kedua operan benar, maka hasilnya benar. Jika kedua operan salah, maka hasilnya salah. Anda mungkin memiliki pertanyaan: mengapa mereka membuat dua versi dari satu operator? Inti dari dua varian operator logika OR yang berbeda adalah bahwa keduanya beroperasi dengan prioritas yang berbeda.

Pertama, mari kita lihat cara kerja operator ||. . Jadi, jika salah satu atau kedua operannya benar, ia akan mengembalikan true . Jika kedua operan mengembalikan nilai false, maka akan mengembalikan false .

Operator OR cara kerjanya sama dengan operator ||. dengan satu pengecualian, jika operator OR digunakan dengan penugasan, operator OR akan mengevaluasi dan mengembalikan nilai operan kiri terlebih dahulu, jika tidak maka cara kerjanya persis sama dengan operator ||. , yaitu. jika salah satu atau kedua operannya benar, ia mengembalikan true . Jika kedua operan mengembalikan false, maka akan mengembalikan false .

Agar lebih jelas cara kerjanya, mari kita berikan contoh berikut:

1 // Pertama, variabel diberi nilai false, lalu operan kedua dievaluasi // Tindakan prioritas: ($var2 = false) atau true $var2 = false atau true; gema $var2; // false tidak dicetak // ($var3 = 0) atau 3 $var3 = 0 atau 3; gema "
$var3"; // => 0 ?>

Operator perbandingan dan logika apa pun dapat digabungkan menjadi struktur yang lebih kompleks:

Ada satu hal penting lagi yang perlu disebutkan mengenai operator OR dan ||. . Operator logika OR memulai evaluasinya dengan operan kirinya; jika mengembalikan nilai true, maka operan kanan tidak akan dievaluasi. Hal ini menghemat waktu eksekusi, namun kehati-hatian harus diberikan untuk memastikan bahwa kode yang menjadi dasar pengoperasian program yang benar tidak ditempatkan di operan sebelah kanan.

Logis DAN (DAN dan &&)

Operator logika AND dinotasikan sebagai AND atau && . Ia melakukan operasi logika AND pada dua operan. Ia mengembalikan nilai true jika dan hanya jika kedua operan bernilai true . Jika salah satu atau kedua operan mengembalikan false , operator mengembalikan false . Arti dari dua versi operator “logis AND” yang berbeda ini sama dengan dua operator sebelumnya, yaitu bekerja dengan prioritas yang berbeda.

Pertama, mari kita lihat cara kerja operator &&. Jadi, jika kedua operannya benar, ia akan mengembalikan true . Jika setidaknya satu atau kedua operannya menghasilkan false , operan tersebut juga akan mengembalikan false .

Operator AND bekerja dengan cara yang sama seperti operator && dengan satu pengecualian, jika operator AND digunakan dengan suatu penugasan, operator AND akan mengevaluasi dan mengembalikan nilai operan kiri terlebih dahulu, jika tidak, operator AND akan bekerja sama persis dengan operator &&. Jika setidaknya salah satu operannya menghasilkan false, ia juga akan mengembalikan false, dan jika kedua operan mengembalikan false, ia akan mengembalikan false.

Untuk memahaminya, sekarang mari kita lihat cara kerjanya dalam praktik:

$bar3"; // => 9 ?>

Eksklusif ATAU (XOR)

Operator OR eksklusif dilambangkan sebagai XOR. Ia mengembalikan nilai benar jika satu dan hanya satu operannya benar. Jika kedua operan bernilai benar, operator akan mengembalikan nilai salah.

Karena operator XOR memiliki prioritas yang sama dengan operator AND dan OR (lebih rendah dari operator penugasan), dan digunakan dalam ekspresi penugasan, operator XOR terlebih dahulu mengevaluasi dan mengembalikan nilai operan kiri.

6 $a1 = 19 xatau 5 > 6; var_dump($a1); // => 19 var_dump(benar xatau benar); // salah var_dump((2< 3) xor (5 != 5)); // true ?>

Logis BUKAN (!)

Operator logika NOT, disebut juga negasi, ditandai dengan tanda! . Ini adalah operator unary yang ditempatkan sebelum operan tunggal. Operator logika NOT digunakan untuk membalikkan nilai logika operannya dan selalu mengembalikan nilai true atau false .

Jika Anda perlu membalikkan nilai ekspresi, seperti a && b , Anda perlu menggunakan tanda kurung: !(a && b) . Juga dengan bantuan operator! Anda dapat mengonversi nilai x apa pun ke nilai Boolean yang setara dengan menggunakan operator: !!x dua kali.

Pembaruan terakhir: 11/1/2015

Di PHP kita dapat menggunakan berbagai operator: aritmatika, logika, dll. Mari kita lihat setiap jenis operasi.

Operasi aritmatika

    + (operasi penjumlahan)

    Misalnya, $a+5

    - (operasi pengurangan)

    Misalnya, $a - 5

    * (perkalian)

    Misalnya, $a*5

    / (divisi)

    Misalnya, $a / 5

    % (mendapatkan sisa pembagian)

    Misalnya: $a=12; gema $a % 5; // sama dengan 2

    ++ (menambah/menambah nilai sebanyak satu)

    Misalnya, ++$a

    Penting untuk memahami perbedaan antara ekspresi ++$a dan $a++ . Misalnya:

    $a=12; $b=++$a; // $b sama dengan 13 echo $b;

    Di sini, pertama, satu ditambahkan ke nilai variabel $a, dan kemudian nilainya disamakan dengan variabel $b. Akan berbeda jika ekspresi terlihat seperti ini: $b=$a++; . Di sini, pertama-tama nilai variabel $a sama dengan variabel $b, kemudian nilai variabel $a dinaikkan.

    -- (mengurangi/menurunkan nilai sebanyak satu)

    Misalnya, --$a . Dan juga, seperti halnya kenaikan, ada dua jenis pencatatan: --$a dan $a--

Operator Penugasan

    Menyamakan variabel dengan nilai tertentu: $a = 5

    Penjumlahan diikuti dengan penugasan hasilnya. Misalnya: $a=12; $a += 5; gema $a; // sama dengan 17

    Pengurangan diikuti dengan penugasan hasilnya. Misalnya: $a=12; $a -= 5; gema $a; // sama dengan 7

    Perkalian diikuti dengan penugasan hasilnya: $a=12; $a *= 5; gema $a; // sama dengan 60

    Pembagian diikuti dengan penugasan hasilnya: $a=12; $a /= 5; gema $a; // sama dengan 2.4

    Gabungkan baris dan tetapkan hasilnya. Berlaku untuk dua baris. Jika variabel tidak menyimpan string, tetapi, misalnya, angka, maka nilainya diubah menjadi string dan kemudian operasi dilakukan: $a=12; $a.= 5; gema $a; // sama dengan 125 // identik dengan $b="12"; $b .="5"; // sama dengan 125

    Memperoleh sisa pembagian dan kemudian menetapkan hasilnya: $a=12; $a %= 5; gema $a; // sama dengan 2

Operasi Perbandingan

Operasi perbandingan biasanya digunakan dalam struktur bersyarat ketika diperlukan untuk membandingkan dua nilai dan, bergantung pada hasil perbandingan, melakukan tindakan tertentu. Operasi perbandingan berikut tersedia.

    Operator kesetaraan membandingkan dua nilai, dan jika keduanya sama, akan menghasilkan nilai benar, jika tidak maka akan menghasilkan nilai salah: $a == 5

    Operator identitas juga membandingkan dua nilai, dan jika keduanya sama, akan menghasilkan nilai benar, jika tidak maka akan menghasilkan nilai salah: $a === 5

    Membandingkan dua nilai, dan jika keduanya tidak sama, akan menghasilkan nilai benar, jika tidak maka akan menghasilkan nilai salah: $a != 5

    Membandingkan dua nilai, dan jika keduanya tidak sama, akan menghasilkan nilai benar, jika tidak maka akan menghasilkan nilai salah: $a !== 5

    Membandingkan dua nilai, dan jika nilai pertama lebih besar dari nilai kedua, maka akan menghasilkan nilai benar, jika tidak maka akan menghasilkan nilai salah: $a > 5

    Membandingkan dua nilai, dan jika nilai pertama lebih kecil dari nilai kedua, maka akan menghasilkan nilai benar, jika tidak maka akan menghasilkan nilai salah: $a< 5

    Membandingkan dua nilai, dan jika nilai pertama lebih besar atau sama dengan nilai kedua, maka akan menghasilkan nilai benar, jika tidak maka akan menghasilkan nilai salah: $a >= 5

    Membandingkan dua nilai, dan jika nilai pertama kurang dari atau sama dengan nilai kedua, maka akan menghasilkan nilai benar, jika tidak maka akan menghasilkan nilai salah: $a<= 5

Operator kesetaraan dan identitas

Kedua operator membandingkan dua ekspresi dan mengembalikan nilai true jika ekspresi sama. Namun ada perbedaan di antara keduanya. Jika operasi kesetaraan mengambil dua nilai dari tipe yang berbeda, maka keduanya direduksi menjadi satu - nilai yang dianggap optimal oleh penafsir. Misalnya:

Jelas sekali, variabel menyimpan nilai berbeda dari tipe berbeda. Namun jika dibandingkan, keduanya akan direduksi menjadi tipe yang sama - numerik. Dan variabel $a akan direduksi menjadi angka 22. Dan pada akhirnya kedua variabel tersebut akan sama besarnya.

Atau, misalnya, variabel-variabel berikut juga akan sama:

$a = salah; $b = 0;

Untuk menghindari situasi seperti itu, operasi kesetaraan digunakan, yang tidak hanya memperhitungkan nilai, tetapi juga jenis variabel:

$a = "22a"; $b = 22; if($a===$b) gema "sama"; else echo "tidak sama";

Sekarang variabelnya tidak akan sama.

Operator pertidaksamaan != dan !== bekerja dengan cara yang sama.

Operasi logis

Operasi logika biasanya digunakan untuk menggabungkan hasil dari dua operasi perbandingan. Misalnya, kita perlu melakukan tindakan tertentu jika beberapa kondisi terpenuhi. Operasi logis berikut tersedia:

    Mengembalikan nilai benar jika kedua operasi perbandingan menghasilkan nilai benar, jika tidak, mengembalikan nilai salah: $a == 5 && $b = 6

    Mirip dengan operasi &&: $a == 5 dan $b > 6

    Mengembalikan nilai benar jika setidaknya satu operasi perbandingan menghasilkan nilai benar, jika tidak, mengembalikan nilai salah: $a == 5 || $b = 6

    Mirip dengan operasi || : $a< 5 or $b > 6

    Mengembalikan nilai benar jika operasi perbandingan menghasilkan nilai salah: !($a >= 5)

    Mengembalikan nilai benar jika hanya satu nilai yang benar. Jika keduanya benar atau tidak ada satupun yang benar, hasilnya salah. Misalnya: $a=12; $b=6; if($a xor $b) echo "benar"; lain gema "salah";

    Di sini hasil operasi logika akan salah karena kedua variabel memiliki nilai tertentu. Mari kita ubah kodenya:

    $a=12; $b=BATAL; if($a xor $b) echo "benar"; lain gema "salah";

    Di sini hasilnya sudah benar, karena nilai satu variabel tidak ditentukan. Jika suatu variabel mempunyai nilai NULL, maka dalam operasi logika nilainya akan dianggap salah

Operasi sedikit

Operasi bit dilakukan pada bit individual suatu angka. Angka dianggap dalam representasi biner, misalnya 2 dalam representasi biner adalah 010, angka 7 adalah 111.

    & (perkalian logis)

    Perkalian dilakukan secara bitwise, dan jika kedua operan memiliki nilai bit sama dengan 1, maka operasi akan mengembalikan 1, jika tidak maka akan dikembalikan angka 0. Contoh: $a1 = 4; //100 $b1 = 5; //101 gema $a1 & $b1; // sama dengan 4

    Di sini angka 4 dalam sistem biner adalah 100, dan angka 5 adalah 101. Kalikan angka tersebut sedikit demi sedikit dan dapatkan (1*1, 0*0, 0 *1) = 100, yaitu angka 4 dalam format desimal.

    | (tambahan logis)

    Mirip dengan perkalian logika, operasi ini juga dilakukan pada digit biner, namun sekarang satu dikembalikan jika setidaknya satu angka dalam digit tertentu memiliki satu. Misalnya: $a1 = 4; //100 $b1 = 5; //101 gema $a1 | $b1; // sama dengan 5

    ~ (negasi logis)

    membalikkan semua bit: jika nilai bitnya 1, maka menjadi nol, dan sebaliknya. $b = 5; gema ~$b;

    X<

    x>>y - menggeser angka x ke kanan sebanyak y digit. Misalnya, 16>>1 menggeser 16 (yaitu 10.000 dalam biner) satu tempat ke kanan, sehingga menghasilkan 1000 atau 8 dalam desimal

String Penggabungan

Operator titik digunakan untuk menggabungkan string. Misalnya, mari kita hubungkan beberapa baris:

$a="Halo,"; $b="dunia"; gema $a . $b . "!";

Jika variabel mewakili tipe lain selain string, seperti angka, maka nilainya diubah menjadi string dan kemudian operasi penggabungan string juga terjadi.

Pelajaran ini akan mencakup pernyataan php bersyarat: pernyataan if dan pernyataan switch

Pernyataan kondisional PHP diwakili oleh tiga konstruksi utama:

  • operator kondisi jika,
  • beralih operator mengalihkan
  • Dan operator terner.

Mari kita lihat lebih dekat masing-masingnya.

PHP jika pernyataan

Gambar 3.1. Pernyataan IF bersyarat, versi singkat


Beras. 3.2. Sintaks Pernyataan Bersyarat IF ELSE


Beras. 3.3. Sintaks lengkap dari pernyataan kondisional IF elseif

Mari kita rangkum:

Sintaks lengkap:

if (kondisi) ( // jika kondisi benar operator1; operator2; ) elseif(kondisi) ( operator1; ... ) else ( // jika kondisi salah operator1; operator2; )

  • Sintaks yang dipersingkat bisa tidak mengandung bagian dari klausa else dan tidak mengandung kondisi tambahan elseif
  • Daripada menggunakan kata fungsi elseif, Anda dapat menulis else if (secara terpisah)
  • Mungkin ada beberapa elseif dalam satu konstruksi if. Ekspresi elseif pertama yang sama dengan TRUE akan dieksekusi.
  • Jika terdapat kondisi elseif alternatif, klausa else harus berada di urutan terakhir dalam sintaksis.

Pernyataan kondisional dapat menggunakan tanda titik dua: sebagai ganti kurung kurawal. Dalam hal ini pernyataan diakhiri dengan kata bantu endif

Beras. 3.4. Pernyataan bersyarat If dan Endif di php

Contoh:

if($x > $y): echo $x." lebih besar dari ".$y; elseif($x == $y): // saat menggunakan ":" Anda tidak dapat menulis secara terpisah jika echo $x." sama dengan ".$y; lain: echo $x." bukan > dan bukan = ".$y; berakhir jika;

Penting: Saat menggunakan titik dua sebagai ganti kurung kurawal dalam suatu konstruksi, elseif tidak dapat ditulis dalam dua kata!

Operasi logis dalam suatu kondisi

Kondisi if dalam tanda kurung mungkin berisi operasi berikut:

Contoh: periksa nilai variabel numerik: jika kurang dari atau sama dengan 10, tampilkan pesan "angka yang kurang dari atau sama dengan 10", jika tidak, tampilkan pesan "angka yang lebih besar dari 10"


Larutan:

$angka=15; jika ($angka<=10) { echo "число меньше или равно 10"; } else { echo "число больше 10"; }

Blok kode PHP bisa dipecah, mari kita lihat contohnya:

Contoh: Tampilkan kode html di layar "a sama dengan 4", jika variabel $a benar-benar sama dengan 4


1 Solusi:
1 2 3 4

2 Solusi:

1 2 3 A sama dengan 4

A sama dengan 4

pekerjaan php 3_1: Tampilkan terjemahan warna dari bahasa Inggris ke bahasa Rusia, periksa nilai variabel (yang warnanya ditetapkan: $a="blue")


pekerjaan php 3_2: Temukan maksimal tiga angka

Operasi perbandingan dan aturan kebohongan

Konstruksi if dalam tanda kurung harus berisi ekspresi atau variabel logis, yang dianggap dari sudut pandang aljabar logika, mengembalikan nilai benar atau salah

Itu. satu variabel dapat bertindak sebagai suatu kondisi. Mari kita lihat sebuah contoh:

1 2 3 4 $a = 1 ; jika ($a) ( gema $a; )

$a=1; jika ($a) ( gema $a; )

Dalam contoh ini, penerjemah bahasa PHP akan menganggap variabel dalam tanda kurung sebagai aturan bohong:

Aturan LIE atau yang dianggap salah:

  • logis PALSU
  • nol utuh ( 0 )
  • nol nyata ( 0.0 )
  • baris kosong dan tali «0»
  • array tanpa elemen
  • objek tanpa variabel
  • tipe khusus BATAL

Jadi, dalam contoh yang dipertimbangkan, variabel $a sama dengan satu, sehingga kondisinya akan benar dan operator echo $a; akan menampilkan nilai variabel.

pekerjaan php 3_3: variabel a dengan nilai string diberikan. Jika a sama dengan namanya, maka cetaklah "Halo nama!", jika a sama dengan nilai kosong, maka keluaran "Halo Orang Asing!"

Konstruksi logika AND OR dan NOT dalam operator kondisional

  1. Terkadang perlu untuk menyediakan pemenuhan beberapa kondisi secara bersamaan. Kemudian kondisinya digabungkan operator logika DAN — && :
  2. $a=1; if ($a>0 || $a>1) ( echo "a > 0 atau a > 1"; )

  3. Untuk menunjukkan apakah suatu kondisi salah, gunakan operator logika TIDAK — ! :
  4. 1 2 3 4 $a = 1 ; jika (! ($a< 0 ) ) { echo "a не < 0" ; }

    $a=1; jika (!($a<0)) { echo "a не < 0"; }

Ganti operator PHP

Operator saklar atau “saklar” menggantikan beberapa konstruksi if yang berurutan. Dalam melakukannya, ia membandingkan satu variabel dengan beberapa nilai. Jadi, ini adalah cara yang paling nyaman untuk mengatur multi-percabangan.

Sintaksis:

1 2 3 4 5 6 7 8 9 10 switch ($variabel) ( case "value1" : operator1 ; break ; case "value2" : operator2 ; break ; case "value3" : operator3 ; break ; [ default : operator4 ; break ; ] )

switch($variabel)( case "value1": operator1; break; case "value2": operator2; break; case "value3": operator3; break; )

  • Operator dapat memeriksa nilai string (kemudian ditentukan dalam tanda kutip) dan nilai numerik (tanpa tanda kutip).
  • Pernyataan break dalam konstruksi diperlukan. Ia keluar dari konstruksi jika kondisinya benar dan operator yang sesuai dengan kondisi tersebut dijalankan. Tanpa jeda, semua pernyataan kasus akan dieksekusi terlepas dari kebenarannya.

Beras. 3.5. Pernyataan Peralihan Bersyarat


Contoh: sebuah array dengan nama lengkap laki-laki diberikan. Periksa elemen pertama array dan, bergantung pada namanya, tampilkan salam dengan nama pendek.


Larutan:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $nama = array("Ivan" , "Peter" , "Semyon" ) ; switch ($nama [ 0 ] ) ( case "Peter" : echo "Halo, Petya!" ; break ; case "Ivan" : echo "Halo, Vanya!" ; break ; case "Semyon" : echo "Hai, Vanya! " ; break ; default : echo "Hai, $nama!"; merusak ; )

$names=array("Ivan","Peter","Semyon"); switch($nama)( case "Peter": echo "Halo, Petya!"; break; case "Ivan": echo "Halo, Vanya!"; break; case "Semyon": echo "Halo, Vanya!"; break ; default: echo "Halo, $nama!"; istirahat; )

pekerjaan php 3_4:

  • Buat variabel $day dan berikan nilai numerik sembarang
  • Menggunakan konstruksi saklar, cetak frasa tersebut "Ini hari kerja", jika nilai variabel $day berada dalam rentang angka dari 1 hingga 5 (inklusif)
  • Cetak frasa tersebut "Ini hari libur", jika nilai variabel $day sama dengan angka 6 atau 7
  • Cetak frasa tersebut "Hari Tidak Diketahui", jika nilai variabel $day tidak termasuk dalam rentang angka dari 1 hingga 7 (inklusif)

Lengkapi kodenya:

1 2 3 4 5 6 7 8 9 10 11 12 ... beralih (... ) ( kasus 1 : kasus 2 : ... gema "Ini hari kerja"; merusak ; kasus 6 : ... bawaan : ... )

Switch(...)( case 1: case 2: ... echo "Ini hari kerja"; break; case 6: ... default: ... )

Operator terner PHP

Operator terner, yaitu. dengan tiga operan, memiliki sintaks yang cukup sederhana di sebelah kiri ? kondisi ditulis, dan di sebelah kanan ada dua operator yang dipisahkan oleh tanda: , di sebelah kiri tanda operator dijalankan jika kondisi benar, dan di sebelah kanan tanda: operator dijalankan jika kondisi terpenuhi PALSU.

kondisi? operator1 : operator2 ;

PHP mendukung standar berikut operator logis: "DAN" dan "&&" (logis DAN), "ATAU" dan "||" (logis ATAU), "!" (logis BUKAN) dan "XOR" (eksklusif ATAU). Semuanya digunakan dalam ekspresi logika untuk menentukan jalannya eksekusi program tertentu tergantung pada hasil yang dikembalikan oleh ekspresi dan berhubungan dengan operator biner, dengan pengecualian operator "!" , yang merupakan unary. Saat menggunakan operator logika, operannya diubah menjadi tipe data Boolean (), dan hasilnya bergantung pada nilai logika yang diberikan dari operan dan jenis operator logika (lihat tabel No. 1).

Tabel No.1. Operator logika

Perbedaan antara operator "AND" dan "&&", serta "OR" dan "||" adalah bahwa operator "AND" , "OR" dan "XOR" memiliki prioritas lebih rendah, bahkan lebih rendah daripada operator penugasan (lihat tabel operator PHP).

Penting untuk memahami bagaimana interpreter memproses ekspresi Boolean. Jika dalam ekspresi dengan operator "||" operan pertama (kiri) akan bernilai true atau dalam ekspresi dengan operator "&&" operan pertama akan bernilai false , maka operan kedua (kanan) tidak dihitung lagi. Hal ini disebabkan oleh fakta bahwa hasil akhir dalam kasus seperti itu tidak akan berubah (lihat tabel No. 1), sehingga tidak perlu membuang waktu untuk memproses kode operan kedua. Namun, Anda harus berhati-hati untuk tidak menempatkan kode di operan yang tepat yang mungkin bergantung pada pengoperasian program yang benar.

Penggunaan operator logika ditunjukkan pada contoh No.2.

salah $a=0||salah; //Sekarang $a==benar, karena 5->benar dan 8->benar $a=5& //Sekarang $a==salah, karena "0"->false $a="0"& //Sekarang $a==benar $a=!false; //Sekarang $a==false, karena 5->benar $a=!5; /* Fungsi foo() tidak akan dipanggil karena shunt */ $a=(false&&foo()); $b=(benar||foo()); $c=(salah dan foo()); $d=(benar atau foo()); /* Perbedaan "||" dari "atau" dan "&&" dari "dan" */ //Bertindak seperti ($a=(false||true)) $a=false||true; //Bertindak seperti (($a=false) atau benar) $a=salah atau benar; //Bertindak seperti ($a=(salah&&benar)) $a=salah& //Bertindak seperti (($a=salah) dan benar) $a=salah dan benar; //Sekarang $a==5, bertindak seperti (($a=5) xor 0) $a=5 xor 0; //Sekarang $a==5, bertindak seperti (($a=5) dan 0) $a=5 dan 0; //Sekarang $a==5, bertindak seperti (($a=5) atau 0) $a=5 atau 0; //Sekarang $a==true, bertindak seperti ($a=(5||0)) $a=5||0; //Sekarang $a==false, bertindak seperti ($a=(5&&0)) $a=5& //Sekarang $a==true, bertindak seperti ($a=(5 xor 6)) $a=(5 xor 6); ?>

Contoh No.2. Menggunakan Operator Boolean

>> Saya telah membaca beberapa tanggapan ini dan sejujurnya tidak menemukan satu pun yang menjelaskan perbedaan antara operator "||" dan "ATAU".

Perbedaannya dijelaskan dalam tautan ke prioritas operator.

"||" operator dievaluasi sebelum penugasan ("="), sedangkan operator "atau" dievaluasi setelah penugasan. Dalam contoh kedua, Anda memberi tahu PHP untuk terlebih dahulu menetapkan hasil "(choice1 != false ? "hah" : "boo")" ke $val, lalu "atau" terhadap pernyataan lainnya. Coba contoh di bawah ini dan Anda akan mengerti maksud saya (perhatikan tanda kurung tambahan untuk menegakkan prioritas):

definisikan("pilihan1" , salah );
mendefinisikan ("pilihan2" , "anjing" );
definisikan("default1" , "lainnya" );
$val = susunan();

$val [ "Tes 1" ] = (choice1 != false ? "hah" : "boo" ) || (pilihan2 != salah ? "hah2" : "boo2" ) || (default1 != salah ? "hah3" : "boo3" );
$val [ "Tes 1b" ] = ((choice1 != false ? "hah" : "boo" ) || (choice2 != false ? "hah2" : "boo2" ) || (default1 != false ? "hah3 " : "boo3" ));
$val [ "Test 2" ] = (choice1 != false ? "hah" : "boo" ) atau (choice2 != false ? "hah2" : "boo2" ) atau (default1 != false ? "hah3" : " boo3" );
$val [ "Test 2b" ] = ((choice1 != false ? "hah" : "boo" ) atau (choice2 != false ? "hah2" : "boo2" ) atau (default1 != false ? "hah3" : "boo3" ));

Foreach ($val sebagai $test => $hasil ) (
print("$tes: "); var_dump ($hasil); mencetak "
\N
\N" ;
}
?>

tes di hto dot com

Karena singkatan OR untuk blok if dapat menghasilkan lebih banyak
kode yang dapat dibaca dengan pengetikan yang lebih sedikit, tergoda untuk menghasilkan fungsi yang akan mengembalikan FALSE jika gagal atau tipe data lain jika berhasil. Seperti mysql_connect, yang "Mengembalikan pengidentifikasi tautan MySQL jika berhasil, atau FALSE jika gagal."

Pengembang php php pemula harus menghindari pembuatan fungsi yang mungkin menghasilkan FALSE jika gagal dan bilangan bulat jika berhasil, jika ada kemungkinan bilangan bulatnya nol.

bla bla bla;
$i = give_me_liberty() atau die("KESALAHAN DB FATAL!" );
bla bla bla;
?>

ironmo67 di yahoo dot com

Menemukan perbedaan yang agak mengganggu antara PHP dan Perl:


jika (!some_function()) mengembalikan false ;
?>

tidak dapat ditulis ulang menjadi lebih cantik:

fungsi beberapa_fungsi ()( kembalikan salah ; )
some_function() atau kembalikan false ;
?>

Namun yang berikut ini akan berfungsi:

fungsi beberapa_fungsi ()( kembalikan salah ; )
some_function() atau die();
?>

Bisakah Anda menebak alasannya? Sederhananya, die() adalah sebuah fungsi dan "return" adalah sebuah pernyataan (seperti perbedaan antara print() dan echo, semacamnya). Ini sangat buruk karena menurut saya versi if(!)() lelah dan tidak dapat dibaca, tapi hei, ini lebih baik daripada if (some_c_function == 0) ( lakukan sesuatu ).

Banyak diskusi di bawah ini dapat dihindari hanya dengan memperjelas bahwa &, | dan ^ *bukan* operator logika. Itu sebabnya mereka tidak terdaftar di halaman ini. Mereka adalah operator yang bertindak berdasarkan representasi biner dari angka. Mereka tidak mengambil nilai logika (yaitu, "benar" atau "salah") sebagai argumen tanpa terlebih dahulu mengonversinya menjadi angka 1 dan 0. Mereka juga tidak mengembalikannya ke angka 1 dan 0. nilai logis, tetapi angka. Tentu saja, nanti Anda dapat memperlakukan angka-angka itu seolah-olah itu adalah nilai logis (dalam hal ini 0 dimasukkan ke "salah" dan yang lainnya dimasukkan ke "benar"), tetapi itu adalah konsekuensi dari Aturan pengecoran tipe PHP, dan tidak ada hubungannya dengan perilaku operator.

Jika Anda menginginkan operasi logika, gunakan operator logika; jika Anda ingin operasi bitwise, gunakan operator bitwise ... menggunakan satu untuk operasi lainnya sepertinya cara yang baik untuk mempersulit.

kws_ di hotpop dot com

"Hanya Karena Kamu Bisa, Bukan Berarti Kamu Harusnya."

Saya juga merasa bahwa menghindari evaluasi arus pendek dan mengandalkan efek samping dalam ekspresi kondisional merupakan gaya yang buruk. Menulis kode yang mendokumentasikan dirinya sendiri menggunakan konstruksi yang jelas dan lugas menurut saya merupakan praktik yang jauh lebih baik daripada menggunakan ekspresi yang berbelit-belit dan sulit dibaca dan menjelaskannya dengan komentar (atau lebih buruk lagi, tidak mendokumentasikannya sama sekali!) Memang, kode sumber seharusnya ditulis untuk mata programmer lebih dari mata komputer.

Memanfaatkan operator bitwise dalam konteks logis dapat melanggar harapan pembaca dan dapat menimbulkan kebingungan karena operator bitwise menyiratkan operan bidang bit.

Saya juga merasa bahwa dengan asumsi bahwa evaluasi hubung singkat adalah yang terbaik untuk konstruksi logis adalah dalam "hak" kompiler, karena ketika operator logika digunakan untuk tujuan yang dimaksudkan, asumsi bahwa hubungan arus pendek membuat *ADA* logis, dan memang demikian. (sekali lagi, bila digunakan dengan benar) mengoptimalkan evaluasi ekspresi logis.

Saya tidak bermaksud untuk secara langsung menyalahkan atau menghina siapa pun, tetapi hanya untuk mencegah penggunaan gaya yang buruk dan untuk mendorong pemrogram baru (dan bahkan beberapa pemrogram berpengalaman) untuk menulis kode yang jelas dan bertele-tele, dan untuk memikirkan pemrogramnya, bukannya komputer yang mungkin akhirnya mencoba menguraikan kreasi Anda.

Sebagai jawaban untuk braintreno:

Contoh kedua yang Anda berikan adalah cara yang benar untuk melakukannya! Ini sama sekali bukan logika yang berbelit-belit, itulah yang membuat kode Anda dapat dibaca tanpa mengandalkan efek samping yang tidak jelas!! Ini jauh lebih mudah untuk dibaca daripada yang pertama dan jauh lebih mudah untuk dipelihara.

Agar gagasan membiarkan fungsi CheckThisOrOther() menyampaikan informasi kepada pengguna saja, lisensi pengkodean Anda harus dicabut. Jika aku harus mempertahankan naskahmu, aku harus membencimu.

Ini tidak dimaksudkan sebagai pemadaman api kedengarannya! Kode sumber tidak ditulis untuk dieksekusi oleh komputer, tetapi untuk dibaca oleh pembuat kode! Ingatlah hal itu dan rekan kerja Anda akan berterima kasih karenanya!

braintrino

Posting Shadedecho untuk memaksa evaluasi kedua ekspresi OR sebenarnya adalah apa yang harus dilakukan untuk menekan optimasi hubung singkat.

Ada banyak kesempatan di mana Anda tidak ingin kompiler melakukan hubungan pendek pada evaluasi apa pun, terutama ketika Anda ingin melakukan situasi dan/atau. Evaluasi hubungan pendek melakukan operasi OR tetapi bukan operasi AND/OR!!!

Misalnya, jika saya ingin memeriksa formulir kueri pengguna untuk melihat apakah pengguna melewatkan menjawab entri apa pun DAN/ATAU jika pengguna telah menggandakan jawaban yang sama untuk lebih dari satu entri, maka saya perlu mengirim formulir kembali ke klien menginformasikan apa yang ingin saya perbaiki.

Fungsi SomeAnswersAreMissing()
{
...
echo "Ups! Anda ketinggalan menjawab beberapa pertanyaan.";
kembali BENAR;
}

Fungsi SomeAnswersAreDuplikat()
{
...
echo "Ups! Anda bisa menjawab keduanya dengan cara yang sama.";
kembali BENAR;
}

Jika (SomeAnswersAreMissing() || SomeAnswersAreDuplikat())
KirimFormLagi();

Jika saya melakukan itu, pengguna hanya akan melihat peringatan jawaban yang hilang tetapi bukan peringatan jawaban duplikat, meskipun keduanya benar. Ini tidak informatif bagi pengguna karena dia harus mengirimkan ulang formulir dua kali sebelum dia menyadari semua kesalahan yang dia lakukan, dan membuat mereka frustrasi. Itu tidak ramah pengguna.

Jika (SomeAnswersAreMissing() | SomeAnswersAreDuplikat())
KirimFormLagi();

Kemudian kedua pesan peringatan dikirim secara bersamaan, dan pengguna dapat memperbaikinya dalam satu kali pengiriman ulang.

Terima kasih shadedecho, saya telah mencari cara untuk mengesampingkan optimasi hubungan arus pendek yang bodoh dari kompiler. Komputer tidak bisa begitu saja berasumsi bahwa hubungan arus pendek adalah yang terbaik :(

BTW, tentu saja Anda bisa melakukan:

$Anda_membuat_a_mistake = salah;

Jika(BeberapaAnswersAreMissing())

jika (BeberapaAnswersAreDuplikat())
$Anda_membuat_a_mistake = benar;

Jika ($Anda_membuat_kesalahan_)
KirimFormLagi();

Tapi itu logika yang berbelit-belit!!!

melompat

Pemula yang terhormat,

(karena saya tidak melihat ide seperti itu muncul di benak programmer berpengalaman...)

Mohon jangan memperhatikan postingan shadedecho dari 14-Mar-2003 04:02! Dia sangat bergantung pada efek samping yang tidak jelas, yang tidak hanya merupakan praktik pemrograman yang sangat buruk, tetapi juga tidak mencapai optimalisasi yang dia kira.

Cara yang tepat untuk melakukan ini


gema $a;
}

Bekerja seperti yang diinginkan shadedecho (meskipun contoh secara keseluruhan agak tidak tepat):

$a.= bla();
$a.= bla2();

Jika ($a) ( gema $a; )

Jika Anda membaca diskusi yang dia tautkan, Anda akan menemukan bahwa dia benar-benar ingin mendapatkan semua entri berbeda dari dua tabel db yang berbeda. Bahkan di sana dia salah. Cara yang tepat untuk melakukannya adalah dengan memproses tabel pertama dan kemudian memproses tabel kedua.
Ini tidak hanya jauh lebih mudah dibaca dibandingkan solusi dengan "|", tetapi juga lebih lambat.

shadedecho

Tampaknya (setelah banyak pencarian dan diskusi yang membuat frustrasi tetapi pada akhirnya bermanfaat di forum seperti tek-tips) bahwa
|| dan && adalah "hubungan pendek" seperti yang telah disebutkan sebelumnya TETAPI | dan operator & (didokumentasikan oleh PHP sebagai operator bitwise) masing-masing berperilaku sebagai bagian tandingannya yang tidak mengalami hubung singkat.

Fungsi bla() (
gema "halo< br>";
kembali "dari bla()< br>";
}

Fungsi bla2() (
gema "dunia\< br>";
kembali "dari bla2()< br>";
}

Jika (($a .= bla()) || ($a .= bla2())) (
gema $a;
}

Ini akan menghasilkan keluaran berikut:

Halo
dari bla()

Perhatikan "dunia" tidak mendapatkan echo"d dan "dari blah2()" tidak mendapatkan concat"d ke dalam variabel $a, karena penugasan pertama ke $a berhasil, sehingga "hubungan arus pendek" dimulai dan pengujian boolean berakhir tanpa mengevaluasi sisanya.

NAMUN, jika Anda mengganti || hanya dengan | dalam pernyataan "jika" itu, Anda mendapatkan output:

Halo
dunia
dari bla()
dari bla2()

Eureka! semua bagian dari tes boolean dievaluasi, dengan cara yang diharapkan dari kiri ke kanan, dan mengikuti semua aturan prioritas normal, sejauh yang saya bisa lihat.

Ini sangat masuk akal... Dengan menggunakan operator bitwise, yang terjadi adalah operasi tingkat bitwise pada hasil dari dua operasi non-bitwise (penugasan). Jika operasi non-bitwise mengembalikan null (dengan kata lain, nilai yang ditetapkan ternyata null atau 0), operator bitwise akan mengikatnya (atau lebih tepat, akan "melihatnya") sebagai "0", jika tidak, ia akan melihat bukan nol (rangkaian bit dengan setidaknya satu "1" di dalamnya).

Kemudian sedikit bijaksana | dilakukan pada dua nilai, dan jika salah satunya bukan nol (memiliki bit "1" di dalamnya) maka hasilnya akan memiliki bit "1" di dalamnya (bukan nol), dan pernyataan if akan menafsirkan non- nilai nol sebagai benar dalam pengujian boolean. Begitu pula jika kedua operan ke | jika null atau 0, maka hasilnya akan menjadi nilai nol, yang mana "jika" akan ditafsirkan sebagai salah.

Pernyataan if di atas berfungsi sedikit bijaksana | pada (dalam hal ini) dua nilai bukan nol (dengan "1" di dalamnya pada tingkat bit), jadi | operasi mengembalikan nilai bukan nol yang kemudian ditafsirkan ulang oleh pernyataan if sebagai TRUE!

Jadi, dalam kasus khusus ini ketika Anda mencoba merangkai pengujian boolean non-hubungan pendek, operator ini mengerjakan operannya pada tingkat bitwise, dan karena mereka bukan operator pembanding tetapi operator matematika, operator tersebut tidak dapat melakukan hubungan pendek. dihubung pendek, dan perilaku yang dihasilkan adalah "uji boolean" non-hubungan pendek.

Saya tahu, Anda pasti mengira saya gila karena mencoba menyiasati pengoptimalan bawaan seperti ini, tetapi saya jamin ada alasan yang sangat bagus untuk itu, dan jika Anda tertarik, Anda dapat melihat utas ini seperti yang saya miliki posting yang sangat panjang di sana yang menjelaskan apa yang saya coba lakukan:

Ini adalah postingan ke-9, di mana Anda akan menemukan deskripsi kueri database saya yang ingin saya optimalkan.

Itu mungkin bukan yang Anda inginkan.

Ini mungkin bisa membantu mereka yang ingin kode mereka dibaca seperti bahasa Inggris, dan mungkin berpikir bahwa perbedaan prioritas dari operator-operator ini relatif eksotik: sebenarnya tidak.

Bagi saya, saya mengalami masalah ini karena tidak ada XOR logis simbolis (misalnya, tidak ada ^^) jadi saya harus menggunakan XOR, dan kemudian berpikir bahwa di tempat yang sama saya harus menggunakan AND dan OR, dan kemudian saya kode rusak :)

Jadi sekarang aku harus melakukannya
$a = ($b xatau $c);

Jesse Thompson
tikungan.com

yohgaki di hotmail dot com

Dalam PHP4, "dan", "atau", "&&", "||" -- semuanya "korsleting" seperti di C/C++. Di PHP3, saya pikir tidak.

"Hubungan pendek" berarti bahasa menghentikan evaluasi ekspresi ketika kondisinya ditentukan. (Sebagian besar bahasa menggunakan evaluasi hubung singkat untuk kondisi logis)

$a = benar;
$b = salah;
jika ($a || $b) (
}

Pernyataan "jika" ini hanya mengevaluasi $a, karena $a benar dan seluruh kondisi harus benar. (yaitu jika $b adalah fungsi dan bukan nilai, fungsi tersebut tidak akan dipanggil)

muerte di web-ster dot com

Saya berharap menemukan operator yang mirip dengan fungsi ||= di Perl. Pikiran pertama saya adalah:

$i = $i atau "default"

Tetapi atau tidak berfungsi seperti itu. Jika Anda ingin menetapkan nilai default ke variabel Anda hanya jika variabel tersebut belum ditetapkan, Anda BISA melakukannya:

$i atau $i = "bawaan"

Contoh pertama TIDAK berfungsi karena operator or tidak dapat kelebihan beban seperti di Perl.

dante di heartme dot com


Saya ingin melakukan sesuatu seperti ini:

$pilihan1 = "";
$pilihan2 = "anjing";
$standar = "lainnya";
$val = $pilihan1 || $pilihan2 || $bawaan;

Tapi kemudian $val1 hanya akan berisi 1 atau 0. Sebaliknya saya melakukan ini:

$pilihan1 = "";
$pilihan2 = "anjing";
$standar = "lainnya";
$val = $choice1 atau $choice2 atau $default;

Sekarang $val berisi string "anjing". Itu
aneh bahwa "atau" berbeda dari "||"...dan saya akan melakukannya
berpikir bahwa "||" harus cukup pintar untuk menanganinya
string...seperti yang dilakukan PERL. Kurasa tidak. Mungkin itu
sebuah pilihan desain.