Php "include" ve "requir" arasındaki fark


174

Aralarında fark var mı? Bunları kullanmak bir tercih midir? Birini diğerinin üzerinde kullanmak herhangi bir avantaj sağlıyor mu? Hangisi güvenlik için daha iyidir?



3
Her zaman "zorunlu" kullanın. "Dahil" saunada elektrikli kapı kadar uygundur.
Marco Mariani

2
@MarcoMariani Bu nasıl sakıncalı olurdu? Muhtemelen açık, görmüyorum. Belki de buhar?
Austin Burk

Basitçe söylemek gerekirse, 'foo.php' dosyası yanlışlıkla eksikse, foo.php içinde olması gereken bir işlev çağrıldığında değil, en kısa zamanda bilmek istiyorum. İçerme ile gereksinimin değiştirilmesi genellikle hataları ortaya çıkarabilir. Diyelim ki config.php eksik ve uygulama varsayılan bir yapılandırma ile çalışıyor. Hangisi güvenlik için daha iyidir? Sauna gelince, ben içerideyken ve kapı nedense açmaz sevmiyorum.
Marco Mariani

Yanıtlar:


148

Ayrıntılı PHP kılavuzunda açıklanan farklılıkları şu sayfada bulabilirsinizrequire :

requireincludehata dışında aynıdır, ölümcül E_COMPILE_ERRORseviye hatası da üretecektir . Diğer bir deyişle, komut dosyasını durdurur, ancak yalnızca E_WARNINGkomut dosyasının devam etmesine izin veren bir uyarı ( ) yayar .

Örnek için @ efritz'in cevabına bakınız.


6
tiposaurus.co.uk/2011/04/04/… " requir () ve include () arasındaki temel fark, yüklenemeyen bir dosyaya () ihtiyacınız varsa (örneğin orada değilse) sayfanın yürütülmesini tamamen durduracak ve başka bir çıktı oluşturulmayacak olan önemli bir hata oluşturur. sayfayı oluşturmaya devam edin. "
stormwild

3
"Ne kullanmanız gerektiği duruma bağlıdır; sayfanın geri kalanı için önemli olan dosyaları yüklemek için en uygun olanıdır; örneğin, veritabanına dayalı bir web siteniz varsa ve database login ve password, include () kullanımı yerine açıkça tercih edilir. Bu durumda include () kullandıysanız, amaçladığınızdan daha fazla uyarı ve hata oluşturabilirsiniz. "
stormwild

3
<?php if (isset($flibbertygibbet)) require 'file.php';bu cevabı tamamen yanlış gösteriyor gibi görünüyor. Aksi takdirde, koşul doğru olmasa da ölümcül bir hata almalıyım. stracePHP dokunmaya çalışırken bile göstermez file.php.
cHao

İnclude () 'dan farklı olarak, bulunduğu satır asla çalıştırılmasa bile, requir () her zaman hedef dosyada okunur. Koşullu olarak bir dosya eklemek istiyorsanız include () kullanın. VE Bununla birlikte, requir () öğesinin oluştuğu satır yürütülmezse, hedef dosyadaki kodlardan hiçbiri yürütülmez. Tam tersini söylüyor gibi mi görünüyorum yoksa yanlış mı anlıyorum?
lorless

1
Bu yorumların tümü, düzenlenmeden önce bu yanıtın orijinal sürümüne atıfta bulunmaktadır. Başlangıçta, if (false) require 'file.php';'file.php' dosyasının yüklenmesine (ancak yürütülmemesine) neden olacağını iddia eden geçersiz bir talep vardı . TLDR bu yorumların tümünü dikkate almaz.
Kevin Wheeler


5

Kullanım includesize komut dosyası (durumunda bu vb yok) dosyasını yüklemeden devam sakıncası yoksa ve siz (siz olmamalıdır rağmen) bir uyarı hata iletisiyle canlı görüntülenen olabilir.

Kullanılması require, komut dosyanızın belirtilen dosyayı yükleyememesi durumunda duracağı ve Önemli bir hata atacağı anlamına gelir.


2

Diğerlerinin de belirttiği gibi, tek fark, gerektiren bir ölümcül hata atar ve içerir - bir yakalanabilir uyarı. Hangisini kullanacağım, benim tavsiyem dahil etmek. Neden? çünkü bir uyarı yakalayabilir ve son kullanıcılar için anlamlı bir geri bildirim üretebilirsiniz. Düşünmek

  // 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!";
  }

Not: örneğin 2 çalışmak için, burada açıklandığı gibi bir hata-istisnalar işleyicisi yüklemeniz gerekir 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");   

İçerme düzeyinde, beklediğiniz dosyanın orada olmadığını öğrenmek için harika bir yer değildir. Örneğinizdeki sorunlardan hiçbiri web sitenizin görüntüleyenlerini etkilemektir.
Kzqai

0
<?PHP
echo "Firstline";
include('classes/connection.php');
echo "I will run if include but not on Require";
?>

Kod ile çok basit Pratik bir örnek. İlk eko görüntülenecektir. Kullandığınız veya içermediğiniz önemli değil, çünkü içerme veya gerektirmeden önce çalışır.

Sonucu kontrol etmek için, Kodun ikinci satırında kasıtlı olarak dosyaya yanlış yol verin veya dosya adında hata yapın. Böylece ikinci yankı görüntülenecek veya kullandığınız olmadığı konusunda tamamen bağımlı olacak değil gerektiren veya dahil .

Eğer kullanırsanız gerektiren ikinci yankı çalıştırmaz fakat kullanırsanız dahil ne hata çok ikinci yankı sonucunu göreceksiniz gelir meselesi değil.


-2

Programın Dahil Et sonlandırılmaması ve tarayıcıda uyarı görüntülenmemesi durumunda, Gereksinim programı dosyanın bulunamaması durumunda sonlandırılır ve önemli bir hata görüntüler.


Cevapların 2 / 3'ünü tekrarlamak için 2 1/2 yıllık bir soruyu gerçekten çarpmak zorunda kaldınız mı?
cHao

4
Aww, o bir acemi! Muhtemelen henüz SO kavramını anlamıyor.
Dan Hanly

Zayıf kullanıcı2069222, şimdi SO'yu terk etti: '(
Gagantous
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.