Perbedaan antara "sertakan" dan "perlu" di php

174

Apakah ada perbedaan di antara mereka? Apakah menggunakannya adalah masalah preferensi? Apakah menggunakan salah satu dari yang lain menghasilkan keuntungan? Mana yang lebih baik untuk keamanan?

Dan Hanly
sumber
3
Selalu gunakan "wajib". "termasuk" senyaman pintu listrik di sauna.
Marco Mariani
2
@MarcoMariani Bagaimana itu tidak nyaman? Mungkin jelas, saya tidak melihatnya. Mungkin uapnya?
Austin Burk
Sederhananya, jika file 'foo.php' hilang karena kesalahan, saya ingin tahu sesegera mungkin, bukan ketika fungsi yang seharusnya ada di foo.php dipanggil. Mengganti termasuk dengan harus sering dapat mengungkapkan bug. Katakanlah config.php tidak ada, dan aplikasi berjalan dengan konfigurasi default. Mana yang lebih baik untuk keamanan? Adapun sauna, ketika saya di dalam dan pintu tidak terbuka karena alasan tertentu saya tidak suka itu.
Marco Mariani

Jawaban:

148

Anda menemukan perbedaan yang dijelaskan dalam manual PHP terperinci di halamanrequire :

requireidentik dengan includekecuali pada kegagalan itu juga akan menghasilkan E_COMPILE_ERRORkesalahan tingkat fatal . Dengan kata lain, itu akan menghentikan skrip sedangkan menyertakan hanya memancarkan peringatan ( E_WARNING) yang memungkinkan skrip untuk melanjutkan.

Lihat jawaban @ efritz sebagai contoh

Steven
sumber
6
tiposaurus.co.uk/2011/04/04/04 ... "Perbedaan utama antara require () dan include () adalah bahwa jika Anda memerlukan () file yang tidak dapat dimuat (mis. jika tidak ada) maka itu menghasilkan kesalahan fatal yang akan menghentikan eksekusi halaman sepenuhnya, dan tidak ada lagi output akan dihasilkan. Di sisi lain, jika Anda memasukkan () file yang tidak dapat dimuat, maka ini hanya akan menghasilkan peringatan dan lanjutkan membangun halaman. "
stormwild
3
"Apa yang harus Anda gunakan tergantung pada situasinya; mengharuskan () paling cocok untuk memuat file yang penting untuk sisa halaman - misalnya jika Anda memiliki situs web yang digerakkan oleh basis data kemudian menggunakan keharusan () untuk memasukkan file yang berisi login dan kata sandi basis data lebih disukai daripada menggunakan include (). Jika Anda menggunakan include () dalam situasi ini, maka Anda mungkin menghasilkan lebih banyak peringatan dan kesalahan daripada yang Anda maksudkan. "
stormwild
3
<?php if (isset($flibbertygibbet)) require 'file.php';tampaknya membuat jawaban ini terlihat sangat salah. Kalau tidak, saya harus mendapatkan kesalahan fatal meskipun kondisinya tidak benar. stracebahkan tidak memperlihatkan PHP yang mencoba menyentuh file.php.
cHao
Tidak seperti include (), mengharuskan () akan selalu membaca di file target, bahkan jika baris itu tidak pernah dijalankan. Jika Anda ingin menyertakan file secara kondisional, gunakan include (). DAN Namun, jika baris yang memerlukan () terjadi tidak dieksekusi, kode di file target tidak akan dieksekusi. Tampaknya mengatakan hal yang sebaliknya, atau apakah saya salah paham?
lorless
1
Semua komentar ini merujuk ke versi asli dari jawaban ini sebelum diedit. Awalnya ada klaim yang tidak valid, mengklaim itu if (false) require 'file.php';akan menyebabkan 'file.php' dimuat (tetapi tidak dieksekusi). TLDR mengabaikan semua komentar ini.
Kevin Wheeler
5

Gunakan includejika Anda tidak keberatan skrip Anda berlanjut tanpa memuat file (kalau-kalau tidak ada dll) dan Anda dapat (meskipun tidak seharusnya) hidup dengan pesan kesalahan Peringatan ditampilkan.

Menggunakan requireberarti skrip Anda akan berhenti jika tidak dapat memuat file yang ditentukan, dan melemparkan kesalahan fatal.

Martin Bean
sumber
2

Seperti yang ditunjukkan orang lain, satu-satunya perbedaan adalah yang mengharuskan melempar kesalahan fatal, dan termasuk - peringatan yang bisa ditangkap. Adapun yang harus digunakan, saran saya adalah tetap menyertakan. Mengapa? karena Anda dapat menangkap peringatan dan menghasilkan umpan balik yang berarti bagi pengguna akhir. Mempertimbangkan

  // Example 1.
  // users see a standard php error message or a blank screen
  // depending on your display_errors setting
  require 'not_there'; 


  // Example 2.
  // users see a meaningful error message
  try {
      include 'not_there';
  } catch(Exception $e) {
     echo "something strange happened!";
  }

NB: misalnya 2 untuk bekerja, Anda perlu menginstal penangan kesalahan-ke-pengecualian, seperti yang dijelaskan di sini http://www.php.net/manual/en/class.errorexception.php

  function exception_error_handler($errno, $errstr, $errfile, $errline ) {
     throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
  }
  set_error_handler("exception_error_handler");   
pengguna187291
sumber
Pada tingkat inklusi bukan tempat yang bagus untuk mengetahui bahwa file yang Anda harapkan tidak ada. Tidak ada masalah dalam contoh Anda yang satu untuk mendorong pemirsa situs web Anda.
Kzqai
0
<?PHP
echo "Firstline";
include('classes/connection.php');
echo "I will run if include but not on Require";
?>

Contoh Praktis yang sangat sederhana dengan kode. Gema pertama akan ditampilkan. Tidak masalah Anda menggunakan termasuk atau memerlukan karena berjalan sebelum memasukkan atau diperlukan.

Untuk memeriksa hasilnya, pada baris kedua kode dengan sengaja memberikan jalur yang salah ke file atau membuat kesalahan dalam nama file. Dengan demikian gema kedua yang akan ditampilkan atau tidak akan sepenuhnya tergantung pada apakah Anda menggunakan mengharuskan atau menyertakan .

Jika Anda menggunakan memerlukan gema kedua tidak akan mengeksekusi tetapi jika Anda menggunakan termasuk tidak peduli apa kesalahan datang Anda akan melihat hasil gema kedua juga.

Tara Prasad Gurung
sumber
-2

Seandainya Program Sertakan tidak akan berhenti dan menampilkan peringatan di browser, Di sisi lain Memerlukan program akan berakhir dan menampilkan kesalahan fatal jika file tidak ditemukan.


sumber
Apakah Anda benar-benar harus menjawab pertanyaan 2 1/2 tahun untuk mengulangi apa yang sudah 2/3 dari jawaban katakan ...?
cHao
4
Aww, dia seorang pemula! Mungkin belum mengerti konsep SO.
Dan Hanly
user2069222 yang malang, sekarang dia meninggalkan SO: '(
Gagantous