Saya mempunyai kod berikut yang menyimpan beberapa kod php pada fail dan kemudian memuatkannya dan menjalankannya semula dan kadangkala kaedah memerlukan mengembalikan int, mengapa ini berlaku?
Bagaimana untuk membiak?
Gunakan dua proses php untuk menjalankan kod di atas
php demo.php
Ini adalah dokumentasi untuk
require
的标准行为,与include
, tingkah laku adalah sama antara keduanya:Seperti yang anda lihat, apabila nilai pulangan tidak ditimpa, integer (1) dikembalikan pada laluan gembira.
Ini masuk akal untuk contoh anda, setakat ini fail itu wujud (jadi tiada ralat maut), tetapi memandangkan fail itu baru dibuat, ia mungkin hanya dipotong, iaitu, ia kosong. p>
Jadi nilai pulangan tidak ditimpa dan anda boleh melihat int(1).
Penjelasan lain adalah secara semula jadi bahawa anda telah menulis ganti dengan integer, yang juga mungkin kerana berbilang proses boleh menulis ke fail yang sama, tetapi dengan cara anda menulis contoh anda, ia berkemungkinan kecil. Saya hanya menyebutnya kerana ia adalah satu lagi penjelasan yang sah.
mengandungi jika ada
Contoh cara menggantung syarat perlumbaan apabila anda mencari
$result
dan bukannya (hanya) apabila fail wujud:Idea di sebaliknya ialah kami melakukan sedikit sahaja pengendalian ralat, seperti menyemak sama ada fail itu wujud, jika tidak, ia tidak boleh disertakan (include() hanya mengeluarkan amaran dan menyampaikannya dengan $result = false), dan kemudian jika $ keputusan dimuatkan ia berlaku untuk ujian is_array().
Inilah yang kami ada untuk ralat, tetapi kami tahu apa yang kami cari, iaitu $result ialah tatasusunan.
Ini selalunya dipanggil transaksi atau operasi transaksi.
Dalam contoh baharu ini, kami tidak memasukkan badan sekiranya apabila tatasusunan $result kosong, iaitu tidak mengandungi sebarang data.
Pada peringkat pemprosesan atur cara, yang mungkin menarik minat kami, kehadiran atau ketiadaan fail, kosong atau tidak kosong, atau ditulis secara salah adalah semua keadaan ralat yang perlu "dimakan" dan membatalkan $hasil.
Ralat takrifan tidak wujud.
Mengendalikan ralat penghuraian (untuk Sertakan-Jika-Wujud)
Memandangkan PHP 7.0 kami boleh menggunakan include() dan jika malangnya fail include yang dikembalikan separuh ditulis kami akan melihat ralat penghuraian PHP yang bolehditangkap:
Sila rujukPHP try-catch-finallyuntuk mengetahui cara membuang pengecualian/kerja pengendalian pengecualian secara terperinci, assert() digunakan untuk merekodkan maksud parameter input $cachePath dalam contoh.
Contoh kedua tidak menggunakan operasi penindasan "@", sebabnya jika anda menggunakannya seperti contoh sebelumnya, dan fail yang akan disertakan akan mengandungi ralat fatal sebenar, ralat maut akan disenyapkan. Pada masa kini, dalam PHP moden, ini bukan masalah besar lagi, tetapi menggunakan file_exists() + include() - walaupun terdapat syarat perlumbaan kerana menyemak masa vs masa penggunaan - selamat (hanya amaran) untuk fail yang tidak wujud dan Ralat maut tidak disembunyikan.
Seperti yang anda lihat, semakin banyak butiran yang anda ketahui, semakin sukar untuk menulis kod yang kalis masa hadapan yang mungkin. Kita tidak boleh tersesat dalam pengendalian ralat itu sendiri, tetapi harus menumpukan pada keputusan dan menentukan bahawa ralat ini tidak wujud.
Yang berkata, include() masih menyebabkan data dimuatkan ke dalam memori, file_exists() hanya digunakan untuk "menindas" amaran, kita tahu bahawa, walau bagaimanapun, include() mungkin mengeluarkan amaran dan mungkin mengembalikan integer dan bukannya satu tatasusunan .
Sekarang, memandangkan pengaturcaraan adalah sukar: anda kemudian boleh membungkusnya dalam satu gelung dan katakan cuba semula tiga kali. Mengapa tidak menggunakanuntuk gelunguntuk mengira dan melindungi percubaan semula berangka?
Isu ini tidak boleh diterbitkan semula jika skrip sentiasa mempunyai hanya seorang pelaksana.
Jika anda bercakap tentang menjalankan skrip ini secara selari, masalahnya ialah menulis fail dalam mod eksklusif tidak melindungi anda daripada membaca fail kemudian semasa proses penulisan.
Proses mungkin menulis ke fail (dan memiliki kunci), tetapi
require
tidak menghormati kunci (kunci sistem fail adalah nasihat, tidak dikuatkuasakan).Jadi penyelesaian yang betul ialah: