PHP 8.4 dikeluarkan pada bulan November, dan anda serta pasukan anda tidak ragu-ragu telah bekerja keras memahami ciri baharu, penamatan dan perubahan yang mengiringi lelaran terbaru bahasa ini. ini termasuk perubahan pada kata kerja HTTP bukan POST.
Dalam blog ini, saya berjalan melalui latar belakang kata kerja HTTP dalam PHP, menjelaskan mengapa HTTP perubahan kata kerja dalam perkara PHP 8.4. Saya kemudian menyediakan panduan untuk pembangun untuk rujukan apabila melaksanakan perubahan ini dalam kod mereka.
PHP dibangunkan dengan mengambil kira web dan pengendalian borang yang disokong daripadanya hari-hari terawal. Pada asalnya dalam HTTP, pada dasarnya hanya terdapat dua kaedah melalui mana penyemak imbas boleh meminta halaman web: melalui GET atau POST. Walaupun bentuk HTML masih menyokong kedua-dua kaedah ini, JavaScript mempunyai keupayaan untuk menghantar permintaan HTTP menggunakan mana-mana kaedah HTTP, dan beberapa kit alat (cth. HTMX) malah boleh mengendalikan perkara ini dengan lancar untuk pembangun.
Permintaan GET menghantar data borang melalui rentetan pertanyaan URL. Ini bermakna bahawa hasil borang boleh ditanda buku, diulang dan juga dicache. Oleh sebab itu, permintaan GET biasanya hanya digunakan untuk tindakan yang meminta keadaan tanpa mengubah keadaan: carian, hasil pengisihan, penapisan hasil, penomboran, dsb.
Jika anda ingin melakukan tindakan yang mungkin membuat perubahan dalam aplikasi — cth., memproses troli beli-belah, menghantar mesej sokongan, memuat naik imej, dsb. — anda akan menggunakan kaedah HTTP POST. Permintaan POST ialah dianggap bukan idempoten, bermakna mereka tidak boleh di-cache dan tidak sepatutnya diulang, kerana ia mempunyai kesan sampingan. Kesan tersebut mungkin bermakna sisipan, perubahan atau pemadaman dalam pangkalan data, operasi sistem fail, permintaan web atau sesuatu yang lain.
Dalam untuk mengautomasikan pengendalian data borang, PHP menyediakan beberapa pembolehubah superglobal yang ia diisi daripada permintaan masuk. $_GET diisi dengan argumen rentetan pertanyaan URL dan boleh diisi daripada sebarang kaedah permintaan. $_POST, walau bagaimanapun, hanya diisi daripada kandungan permintaan POST yang dibuat menggunakan aplikasi jenis kandungan/x-www-form-urlencoded, yang mungkin kelihatan seperti ini:
title=HTTP Verbs Changes in PHP 8.4&url=https://example.org/blog/php-8.4-http-verbs&author=Just Some Guy&tags[0]=php&tags[1]=http
PHP akan ambil itu dan isikan superglobal $_POST supaya ia menjadi seperti berikut:
<?php $_POST = [ 'title' => 'HTTP Verbs Changes in PHP 8.4', 'url' => 'https://example.org/blog/php-8.4-http-verbs', 'author' => 'Just Some Guy', 'tags' => ['php', 'http'], ];
Fakta bahawa PHP melakukan ini di sebalik tabir untuk anda adalah sebahagian daripada perkara yang menjadikan PHP begitu mudah untuk dipelajari dan dimulakan.
Selain itu, ia juga boleh mengendalikan jenis kandungan multipart/form-data, yang membolehkan penyemak imbas memuat naik fail selain menyediakan data borang. Apabila ia berbuat demikian, ia akan mengisi $_FILES tambahan superglobal, yang menyediakan maklumat mengenai fail yang dimuat naik; pembangun kemudian boleh mengesahkan dan pra-memproses fail tersebut sebelum menyimpan mereka di lokasi tetap.
Terdapat lebih banyak kaedah HTTP daripada GET dan POST, dan pembangun untuk web selalunya akan mahu memilih kaedah yang berbeza untuk memberikan konteks kepada apa mereka cuba lakukan:
Walaupun penyemak imbas tidak menyokong ini secara asli (belum!), banyak rangka kerja dan perpustakaan JavaScript melakukannya.
Tetapi ada tangkapan: PHP tidak mengendalikan permintaan ini secara automatik. Dalam sebenarnya, anda perlu mengendalikan penghuraian ini sepenuhnya sendiri, yang mana boleh menjadi sangat bermasalah apabila anda juga mula mengendalikan muat naik fail sebagai serta data borang. (Jangan sekali-kali melancarkan penghurai anda sendiri!)
PHP 8.4 memperkenalkan kaedah request_parse_body():
[$_POST, $_FILES] = request_parse_body(?array $options = null);
The
fungsi menghuraikan permintaan masuk dengan cara yang sama seperti yang selalu ada
untuk permintaan POST, tetapi membolehkan anda menentukan pembolehubah ganti kepada
simpan data borang dan muat naik fail dalam (atau tulis ganti superglobal,
jika anda lebih suka). Anda juga boleh mengubah gelagat penghurai melalui hujah $options, dengan lebih lanjut mengenainya di bawah.
Corak biasa mungkin:
<?php if (in_array($_SERVER['REQUEST_METHOD'], ['PUT', 'PATCH', 'DELETE'], true)) { [$_POST, $_FILES] = request_parse_body(); }
(Walaupun jika anda sedang menggunakan rangka kerja, harapkan rangka kerja menjaga butiran itu untuk anda.)
Itu secara literal keseluruhan ciri. Fungsi mudah untuk disediakan tingkah laku turnkey yang anda sudah biasa dengan sebagai pembangun PHP. Ia tidak menjadi lebih baik daripada ini!
Sekarang bahawa kita telah membincangkan perubahan kepada kata kerja HTTP dalam PHP 8.4, mari lihat beberapa contoh untuk cara anda boleh menggunakan dan menerapkannya kemas kini dalam kod anda.
Sama seperti permintaan POST, request_parse_body() hanya akan menghuraikan permintaan dengan kandungan berikut jenis:
Dalam kes permohonan/x-www- form-urlencoded, $_FILES-setara tatasusunan (indeks 1 dalam tatasusunan yang dikembalikan) akan kosong. Jika kandungan jenis tidak disokong, fungsi akan membuang InvalidArgumentException.
PHP membolehkan anda memeriksa kandungan permintaan mentah melalui aliran php://input. Ini ialah strim buffer yang boleh (sehingga PHP 7.4) dibaca beberapa kali. Walau bagaimanapun, apabila menerima multipart/form-data kandungan, PHP menjadi agak merosakkan, atas sebab yang sangat baik: penimbalan fail boleh menyebabkan kandungan fail ditulis ke cakera dua kali, membawa kepada lebih banyak memori, storan dan penggunaan I/O.
Oleh itu, request_parse_body() TIDAK MESTI dipanggil dua kali, kerana ia akan menggunakan php://input secara merosakkan.
Parameter $options to request_parse_body() membolehkan anda mengubah tingkah lakunya pada masa jalan, bukannya bergantung pada konfigurasi php.ini berkod keras.
Atas ialah kandungan terperinci Perubahan Kata Kerja HTTP dalam PHP 8.4. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!