Saya telah melihat baris baru berikut di PHP 7, tetapi tidak ada yang benar-benar menjelaskan apa artinya. Saya sudah mencarinya di Google dan yang mereka bicarakan hanyalah apakah Anda akan mengaktifkannya atau tidak suka jenis polling.
declare(strict_types = 1);
Apa fungsinya? Bagaimana pengaruhnya terhadap kode saya? Haruskah saya melakukannya?
Beberapa penjelasan akan menyenangkan.
php
php-7.2
strong-typing
weak-typing
sufuko
sumber
sumber
Jawaban:
Dari blog Treehouse :
Secara default, PHP akan memberikan nilai dari tipe yang salah ke dalam tipe skalar yang diharapkan jika memungkinkan. Misalnya, fungsi yang diberi bilangan bulat untuk parameter yang mengharapkan string akan mendapatkan variabel tipe string.
Jenis ketat dinonaktifkan ( eval ):
Dimungkinkan untuk mengaktifkan mode ketat berdasarkan per file. Dalam mode ketat, hanya variabel tipe deklarasi tipe persis yang akan diterima, atau TypeError akan dilempar. Satu-satunya pengecualian untuk aturan ini adalah bahwa integer dapat diberikan ke fungsi yang mengharapkan float. Panggilan fungsi dari dalam fungsi internal tidak akan terpengaruh oleh deklarasi strict_types.
Untuk mengaktifkan mode ketat, pernyataan pernyataan digunakan dengan deklarasi strict_types:
Jenis ketat diaktifkan ( eval ):
Contoh kerja:
sumber
strict_types
mempengaruhi tipe paksaan.Menggunakan petunjuk jenis tanpa
strict_types
dapat menyebabkan bug halus.Sebelum tipe yang ketat,
int $x
berarti "$x
harus memiliki nilai yang dapat dipaksakan untuk int." Nilai apa pun yang dapat dipaksakan kepada suatuint
akan melewati petunjuk tipe, termasuk:242
),10.17
),true
),null
, atau"13 Ghosts"
).Dengan menyetel
strict_types=1
, Anda memberi tahu mesin ituint $x
berarti "$ x hanya boleh berupa int yang tepat, tidak ada paksaan tipe yang diizinkan." Anda memiliki jaminan besar bahwa Anda mendapatkan persis dan hanya apa yang diberikan, tanpa konversi dan potensi kerugian.Contoh:
Menghasilkan hasil yang berpotensi membingungkan:
Kebanyakan pengembang akan mengharapkan, saya pikir, sebuah
int
petunjuk yang berarti "hanya sebuah int". Tetapi tidak, itu berarti "sesuatu seperti int". Mengaktifkan strict_types memberi kemungkinan perilaku yang diharapkan dan diinginkan:Hasil:
Saya pikir ada dua pelajaran di sini, jika Anda menggunakan petunjuk ketik:
strict_types=1
selalu.strict_types
pragma.sumber
strict_types
.