MENGAPA INI TERJADI?
Seiring waktu, PHP telah menjadi bahasa yang lebih fokus pada keamanan. Pengaturan yang dulu dimatikan secara default sekarang dihidupkan secara default. Contoh sempurna untuk ini adalah E_STRICT
, yang dinyalakan secara default pada PHP 5.4.0 .
Selanjutnya, menurut dokumentasi PHP, secara default, E_NOTICE
dinonaktifkan di php.ini. PHP docs merekomendasikan menyalakannya untuk keperluan debugging . Namun, ketika saya mengunduh PHP dari repositori Ubuntu dan dari tumpukan Windows BitNami, saya melihat sesuatu yang lain.
; Common Values:
; E_ALL (Show all errors, warnings and notices including coding standards.)
; E_ALL & ~E_NOTICE (Show all errors, except for notices)
; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.)
; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
Perhatikan bahwa error_reporting
sebenarnya diatur ke nilai produksi secara default, bukan ke nilai "default" secara default. Ini agak membingungkan dan tidak didokumentasikan di luar php.ini, jadi saya belum memvalidasi ini pada distribusi lain.
Namun, untuk menjawab pertanyaan Anda, kesalahan ini muncul saat tidak muncul sebelumnya karena:
Anda menginstal PHP dan pengaturan default baru agak kurang didokumentasikan tetapi tidak mengecualikan E_NOTICE
.
E_NOTICE
peringatan seperti variabel yang tidak ditentukan dan indeks yang tidak ditentukan sebenarnya membantu membuat kode Anda lebih bersih dan lebih aman. Saya dapat memberitahu Anda bahwa, bertahun-tahun yang lalu, dengan E_NOTICE
mengaktifkan terus memaksa saya untuk mendeklarasikan variabel saya. Itu membuatnya BANYAK lebih mudah untuk belajar C, tidak menyatakan variabel jauh lebih besar dari gangguan.
APA YANG BISA SAYA LAKUKAN TENTANG ITU?
Matikan E_NOTICE
dengan menyalin "Nilai default" E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
dan menggantinya dengan apa yang saat ini dihapus komentar setelah sama dengan masuk error_reporting =
. Mulai ulang Apache, atau PHP jika menggunakan CGI atau FPM. Pastikan Anda mengedit "benar" php.ini. Yang benar adalah Apache jika Anda menjalankan PHP dengan Apache, fpm atau php-fpm jika menjalankan PHP-FPM, cgi jika menjalankan PHP-CGI, dll. Ini bukan metode yang disarankan, tetapi jika Anda memiliki kode lawas yang akan menjadi sangat sulit untuk diedit, maka itu mungkin taruhan terbaik Anda.
Matikan E_NOTICE
level file atau folder. Ini mungkin lebih disukai jika Anda memiliki beberapa kode lama tetapi ingin melakukan hal-hal dengan cara yang "benar" sebaliknya. Untuk melakukan ini, Anda harus berkonsultasi dengan Apache2, Nginx, atau apa pun server pilihan Anda. Di Apache, Anda akan menggunakan php_value
bagian dalam <Directory>
.
Tulis ulang kode Anda menjadi lebih bersih. Jika Anda perlu melakukan ini saat pindah ke lingkungan produksi atau tidak ingin seseorang melihat kesalahan Anda, pastikan Anda menonaktifkan tampilan kesalahan apa pun, dan hanya mencatat kesalahan Anda (lihat display_errors
dan log_errors
di php.ini dan pengaturan server Anda) .
Untuk memperluas opsi 3: Ini adalah yang ideal. Jika Anda dapat menempuh rute ini, Anda harus melakukannya. Jika Anda tidak memulai rute ini pada awalnya, pertimbangkan untuk memindahkan rute ini pada akhirnya dengan menguji kode Anda di lingkungan pengembangan. Sementara Anda berada di sana, singkirkan ~E_STRICT
dan ~E_DEPRECATED
lihat apa yang salah di masa depan. Anda akan melihat BANYAK kesalahan yang tidak dikenal, tetapi itu akan menghentikan Anda dari memiliki masalah yang tidak menyenangkan ketika Anda perlu meningkatkan PHP di masa depan.
APA ARTINYA KESALAHAN?
Undefined variable: my_variable_name
- Ini terjadi ketika variabel belum didefinisikan sebelum digunakan. Ketika skrip PHP dieksekusi, secara internal hanya mengasumsikan nilai nol. Namun, dalam skenario mana Anda perlu memeriksa variabel sebelum didefinisikan? Pada akhirnya, ini adalah argumen untuk "kode ceroboh". Sebagai seorang pengembang, saya dapat memberitahu Anda bahwa saya menyukainya ketika saya melihat proyek open source di mana variabel didefinisikan sebagai tinggi dalam cakupan mereka karena mereka dapat didefinisikan. Itu membuatnya lebih mudah untuk mengetahui variabel apa yang akan muncul di masa depan dan membuatnya lebih mudah untuk membaca / mempelajari kode.
function foo()
{
$my_variable_name = '';
//....
if ($my_variable_name) {
// perform some logic
}
}
Undefined index: my_index
- Ini terjadi ketika Anda mencoba mengakses nilai dalam array dan itu tidak ada. Untuk mencegah kesalahan ini, lakukan pemeriksaan bersyarat.
// verbose way - generally better
if (isset($my_array['my_index'])) {
echo "My index value is: " . $my_array['my_index'];
}
// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
echo "My index value is: " . $my_index_val;
Pilihan lain adalah mendeklarasikan array kosong di bagian atas fungsi Anda. Ini tidak selalu memungkinkan.
$my_array = array(
'my_index' => ''
);
//...
$my_array['my_index'] = 'new string';
(tip tambahan)
- Ketika saya menghadapi masalah ini dan lainnya, saya menggunakan NetBeans IDE (gratis) dan memberi saya sejumlah peringatan dan pemberitahuan. Beberapa dari mereka menawarkan tips yang sangat membantu. Ini bukan persyaratan, dan saya tidak menggunakan IDE lagi kecuali untuk proyek-proyek besar. Saya lebih dari
vim
orang hari ini :).