
Sintaks
- Lembutkan Persyaratan Sintered Heredoc dan Nowdoc
- Dukungan untuk membuntuti koma dalam panggilan fungsi dan metode
- Tautan dalam
list()
Fitur usang (usang)
image2wbmp()
tidak digunakan lagi- Bendera
FILTER_FLAG_SCHEME_REQUIRED
dan FILTER_FLAG_HOST_REQUIRED
saat menggunakan FILTER_VALIDATE_URL
- Daftarkan konstanta independen tidak digunakan lagi
Fitur baru
- Pengecualian opsional untuk kesalahan dalam
json_decode
json_encode
dan json_decode
- Menambahkan fungsi
is_countable()
- Menambahkan fungsi
array_key_first()
dan array_key_last()
Perubahan
- Bermigrasi dari PCRE ke PCRE2
Lembutkan Persyaratan Sintered Heredoc dan Nowdoc
Heredoc dan Nowdoc menuntut untuk menempatkan pengidentifikasi penutup pertama di baris baru.
Contoh:
$foo = <<<IDENTIFIER the crazy dog jumps over the lazy fox "foo" bar; IDENTIFIER
Di sini, IDENTIFIER
penutup harus menjadi karakter pertama pada baris baru agar ini berfungsi. Selain itu, seharusnya tidak ada karakter lain setelah pengidentifikasi penutup (kecuali ;
yang opsional).
RFC untuk PHP 7.3 menyarankan untuk menghapus persyaratan ini untuk meningkatkan keterbacaan kode. Pertama-tama, untuk menambahkan lekukan saat menggunakan pengidentifikasi heredoc/nowdoc
.
Daftar lengkap perubahan pada sintaks heredoc/nowdoc
:
- Pengidentifikasi penutup tidak harus menjadi karakter pertama dalam string.
- Pengidentifikasi penutup diberi indentasi dengan spasi atau tab.
- Lekukan (spasi atau tab) tidak boleh dicampur. Jika Anda melakukan ini, Anda akan mendapatkan
Parse error: Invalid indentation - tabs and spaces cannot be mixed in .. on line ..
- Jumlah persis spasi / tab yang digunakan sebelum pengidentifikasi penutup akan dihapus dari setiap baris ekspresi
heredoc/nowdoc
. - Jika jumlah karakter indentasi yang digunakan sebelum pengidentifikasi penutup lebih besar daripada di salah satu baris ekspresi, Anda akan mendapatkan
Parse error: Invalid body indentation level (expecting an indentation level of at least ..) in .. on line ..
- beberapa ekspresi setelah pengidentifikasi penutup akan berfungsi tanpa kesalahan
Berikut ini cuplikan yang memanfaatkan fitur baru tanpa melanggar aturan baru:
$foo = ['foo', 'bar', <<<EOT baz - hello world! -- ahoy EOT, 'qux', 'quux' ]; var_dump($foo);
Outputnya adalah:
array(5) { [0]=> string(3) "foo" [1]=> string(3) "bar" [2]=> string(29) "baz - hello world! -- ahoy" [3]=> string(3) "qux" [4]=> string(4) "quux" } `
Perhatikan bahwa lekukan yang digunakan dalam deklarasi menggunakan heredoc
tidak ditampilkan dalam output var_dump()
, dan kami terus membuat daftar elemen array setelah pengidentifikasi EOT
.
RFC , diskusi tentang Externals.io , implementasi
Dampak Kompatibilitas Mundur
Sampai Anda menggunakan satu set heredox/nowdoc
karakter heredox/nowdoc
identik sebagai awal baris, Anda berada di atas kuda.
$foo = <<<HELLO HELLO_WORLD <-- HELLOWORLD <-- HELLO WORLD <-- HELLO;
Jika Anda memiliki sintaks heredoc/nowdoc
mirip dengan yang dijelaskan di atas, saya perhatikan bahwa dengan PHP 7.3, PHP akan menerima HELLO
literal pertama dan melemparkan kesalahan pada baris berikutnya. Dalam versi sebelumnya, HELLO WORLD
tidak dianggap sebagai pengidentifikasi penutup untuk heredoc. Terima kasih / u / ImSuperObjective2 dengan reddit untuk menunjukkan ini
Dukungan untuk membuntuti koma dalam panggilan fungsi dan metode
Ini adalah perubahan sederhana yang memungkinkan penggunaan tanda koma dalam panggilan fungsi dan metode. Ini tidak mempengaruhi deklarasi.
Misalnya, sintaks berikut akan menjadi mungkin:
Dalam versi pra-PHP-7.3, cuplikan di atas melempar PHP Parse error: syntax error, unexpected ')' in .. on line ..
Anda tidak dapat menggunakan lebih dari satu koma di bagian akhir atau menggunakan koma untuk melewati argumen. Ini terutama merupakan perubahan untuk fungsi dengan parameter variabel. Juga dengan pengeditan baru, sintaks array akan terlihat lebih konsisten.
Perhatikan bahwa Anda tidak dapat menggunakan fitur ini dalam deklarasi fungsi / metode; ini salah:
function foo($bar, $baz, ) {
RFC , diskusi tentang Externals.io , implementasi
Dampak Kompatibilitas Mundur
Tidak ada Kode yang ada akan terus berfungsi. Jika Anda memiliki panggilan fungsi yang menerima parameter variabel, tambahkan tanda koma ke tempat-tempat ini untuk kenyamanan. Tetapi menggunakannya di mana-mana jelas terlalu banyak.
Tautan dalam list()
Fungsi list()
berguna untuk dengan cepat memberikan nilai ke variabel dari array. Sebelum PHP 7.3, itu tidak mungkin untuk menentukan variabel dengan referensi. Sebelum PHP 7.3, cuplikan berikut ini menyebabkan kesalahan fatal:
$arr = ['apple', 'orange']; list($a, &$b) = $arr; $b = 'banana'; echo $arr[1];
Tidak mungkin merujuk ke variabel yang non-referencable
: list($a, &$b) = [12, 14];
akan memberikan Fatal error: Cannot assign reference to non referencable value in .. on line ..
RFC , diskusi tentang Externals.io , implementasi
Dampak Kompatibilitas Mundur
Tidak. Alih-alih menggunakan list()
untuk mengisi beberapa variabel, saya sarankan Anda menggunakan objek nilai untuk membuat hal-hal lebih sederhana. Mereka masih akan diteruskan dengan referensi, tetapi akan membuat kode Anda jauh lebih bersih.
image2wbmp()
tidak digunakan lagi
fungsi image2wbmp()
dari ekstensi GD digunakan untuk menampilkan gambar dalam format WBMP (Wireless Bitmap). Dalam PHP 7.3, ia tidak lagi mendukung fungsi imagewbmp()
.
Jika Anda menggunakan image2wbmp()
, maka ganti saja nama fungsi dengan imagewbmp
dan semuanya akan baik-baik saja! Lebih dari 5,500 image2wbmp()
di github versus lebih dari 39,300 imagewbmp()
. Sepertinya tim pengembang PHP menghilangkan fitur yang jarang digunakan untuk meminimalkan dampak.
RFC , diskusi tentang Externals.io , implementasi
Dampak Kompatibilitas Mundur
Jika Anda menggunakan fungsi image2wbmp()
, ganti panggilan dengan imagewbmp
. Manfaatkan otomatisasi yang dapat mengubah ini untuk Anda.
Bendera FILTER_FLAG_SCHEME_REQUIRED
dan FILTER_FLAG_HOST_REQUIRED
saat menggunakan FILTER_VALIDATE_URL
Ini adalah gerakan maju. Saat Anda menggunakan filter_var($var, FILTER_VALIDATE_URL)
, ada dua flag tambahan yang dapat diatur untuk memastikan pengecekan URL yang ketat: FILTER_FLAG_SCHEME_REQUIRED
dan FILTER_FLAG_HOST_REQUIRED
.
Dimulai dengan PHP 5.2.1, kedua flag ini diterapkan secara implisit terlepas dari apakah mereka disetel atau tidak.
Jika kode Anda menggunakan flag-flag ini, hapus saja dan itu akan baik-baik saja. Saat ini ada lebih dari 5.000 hasil pencarian github yang menggunakannya.
RFC , diskusi tentang Externals.io , implementasi
Dampak Kompatibilitas Mundur
Karena kedua flag ini sudah usang, Anda akan melihat notifikasi seperti:
Deprecated: filter_var(): explicit use of FILTER_FLAG_SCHEME_REQUIRED and FILTER_FLAG_HOST_REQUIRED is deprecated in ...
Yang harus Anda lakukan hanyalah menghapus dua flag, sebagai mereka FILTER_VALIDATE_URL
tersirat saat menggunakan FILTER_VALIDATE_URL
.
Daftarkan konstanta independen tidak digunakan lagi
Fungsi define()
memungkinkan Anda untuk mendeklarasikan konstanta dalam mode case-insensitive. Anda harus secara eksplisit mendeklarasikan konstanta case-sensitive dengan melewatkan parameter ketiga dari fungsi true
. Ini bukan perilaku default dan mungkin tidak konsisten dengan kemampuan untuk mendeklarasikan konstanta melalui kata kunci const
.
define('Foo', 'Bar', true);
Kode di atas akan membuang pemberitahuan usang: Deprecated: define(): Declaration of case-insensitive constants is deprecated in ...
Selain itu, ketika Anda mencoba mengakses konstanta yang dideklarasikan dalam mode Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "Foo"
( FOO
), Anda akan melihat peringatan yang cukup berguna: Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "Foo"
Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "Foo"
RFC , diskusi tentang Externals.io , implementasi
Dampak Kompatibilitas Mundur
Anda harus pergi ke kode dasar, di mana konstanta register-independen dideklarasikan dan kemudian diperbaiki. Sangat tidak mungkin akan ada masalah dengan ini, karena agak sulit untuk menangkap semua kasus penggunaan, tetapi sebagai hasilnya kode akan menjadi lebih jelas.
Saya belum menemukan contoh penggunaan ini di github, tetapi setidaknya Drupal dan WordPress (dua proyek PHP yang cukup tua dan matang) memiliki konstanta case-insensitive.
Pengecualian opsional untuk kesalahan dalam json_decode
json_encode
dan json_decode
Salah satu favorit saya. Selama bertahun-tahun, json_encode()
dan json_decode()
diam tentang kesalahan dalam variabel PHP atau string json, yang menyebabkan kode yang ditandai. Kasus ini bahkan dalam kritik terkenal PHP: Fraktal desain yang buruk .
json_decode
mengembalikan null untuk input yang tidak valid, sedangkan null adalah objek yang benar-benar benar untuk JSON yang didekodekan. Fungsi ini sama sekali tidak dapat diandalkan, kecuali tentu saja Anda memanggil json_last_error
setiap kali Anda menggunakannya.
Butuh 6 tahun setelah posting blog itu dan kami memiliki kesempatan untuk mendapatkan kesalahan tentang kegagalan json:
try { json_decode("{", false, 512, JSON_THROW_ON_ERROR); } catch (\JsonException $exception) { echo $exception->getMessage();
\JsonException
adalah turunan dari \Exception
, serta konstanta JsonException
dan JsonException
sendiri berada di namespace global.
Saya sangat menyarankan Anda mulai menggunakan fitur ini. Ada perpustakaan pihak ketiga, seperti daverandom / exceptional-json , yang mengimplementasikan fungsionalitas serupa untuk versi PHP 7.2 dan di bawahnya. Dengan tampilan fungsi ini di inti PHP, Anda dapat menghapus paket ini dan berton-ton kode template jelek dengan panggilan json_last_error()
di setiap tempat Anda bekerja dengan json.
RFC , diskusi tentang Externals.io , implementasi
Dampak Kompatibilitas Mundur
Tidak ada apa-apa jika Anda tidak menggunakan pengecualian Anda sendiri dan / atau konstan dengan nama yang sama.
Menambahkan fungsi is_countable()
PHP 7.2 memiliki banyak fungsi yang usang dan bermasalah. Jika Anda menggunakan PHP 7.2. count()
panggilan count()
menggunakan variabel yang tidak countable
, maka PHP akan menampilkan peringatan tentang ini. Dalam pengeditan umum, ada proposal untuk memeriksa variabel yang dihasilkan untuk countable
sebelum menggunakannya dalam count()
.
countable
-variable adalah array atau objek yang mengimplementasikan \Countable
interface. Karena banyak kode boilerplate akan digunakan selama verifikasi, PHP 7.3 memperkenalkan fungsi baru is_countable()
, yang memeriksa variabel untuk ... yah ... kemungkinan menggunakan count()
.
Saya menulis polyfile untuk is__countable () jika Anda ingin mulai menggunakan fitur ini sekarang.
RFC , diskusi tentang Externals.io , implementasi
Dampak Kompatibilitas Mundur
Sampai fungsinya sendiri is_countable()
, tidak akan ada masalah.
Menambahkan fungsi array_key_first()
dan array_key_last()
Di PHP, ada 75 fungsi yang berbeda untuk bekerja dengan array, tetapi sejauh ini belum ada cara mudah untuk mendapatkan kunci pertama dan terakhir dari sebuah array tanpa mengubah pointer array atau mengulangi semua kunci (melalui array_keys()
) dan kemudian mendapatkan nilai pertama / terakhir.
Dua fungsi baru telah array_key_first()
, array_key_first()
dan array_key_last()
memungkinkan Anda untuk melakukan ini.
RFC juga menyarankan untuk menambahkan array_value_first()
dan array_value_last()
, tetapi bagian ini tidak memberikan suara.
RFC , diskusi tentang Externals.io , implementasi
Dampak Kompatibilitas Mundur
Jika Anda tidak mendeklarasikan fungsi array_key_first()
dan array_key_last()
Anda sendiri, maka tidak ada masalah.
Bermigrasi dari PCRE ke PCRE2
PHP menggunakan Ekspresi Reguler Kompatibel Perl atau yang tidak lama PCRE di perpustakaan untuk bekerja dengan ekspresi reguler. Sejak PHP 7.2, versi 8.x dari PCRE Legacy Library telah digunakan, dan dalam PHP 7.3 PCRE2 sudah akan digunakan. Harap perhatikan bahwa PCRE2 dianggap sebagai perpustakaan baru, meskipun sebagian besar kompatibel dengan PCRE (8.x).
Perpustakaan baru lebih agresif dalam validasi pola dan dapat menyebabkan kesalahan dalam kode yang ada. Cuplikan berikut akan tidak valid dengan PHP 7.3:
preg_match('/[\w-.]+/', '');
PHP akan memberikan peringatan. Warning: preg_match(): Compilation failed: invalid range in character class at offset 3
.
Masalah dengan pola: agar ini berfungsi, tanda hubung harus dipindahkan ke akhir atau melarikan diri.
preg_match('/[\w\-.]+/', '');
Kode di atas akan berfungsi dengan baik tidak hanya dengan PHP 7.3, tetapi juga dengan versi yang lebih lama. Dalam pola baru, tanda hubung dilepaskan -
ke \-
. Ini adalah masalah paling umum yang mungkin Anda temui ketika menyelesaikan masalah kompatibilitas.
Ini adalah perubahan yang sangat kecil, tetapi ada kemungkinan bahwa semuanya akan salah. Pesan kesalahan menunjukkan posisi tepat karakter dalam ekspresi reguler. Pastikan untuk memeriksa kode Anda dengan cermat. Periksa ekspresi reguler Anda untuk kompatibilitas dengan sintaks PCRE2 melalui Regex Buddy
atau perangkat lunak serupa lainnya. Lihat deskripsi sintaks PCRE2 dan sintaks PCRE lama untuk informasi lebih lanjut.
RFC , diskusi tentang Externals.io , implementasi
Dampak Kompatibilitas Mundur
Karena PCRE2 lebih pilih-pilih dan ketat tentang template, beberapa preg_match()
dan panggilan serupa mungkin tidak berfungsi. Perbaikan bervariasi dari hanya memperbarui templat (misalnya, melarikan diri tanda hubung) ke templat penulisan ulang. Pastikan semua tes Anda lulus.