ความแตกต่างระหว่าง "รวม" และ "ต้องการ" ใน php


174

มีความแตกต่างระหว่างพวกเขาหรือไม่? ใช้พวกเขาเป็นเรื่องของการตั้งค่าหรือไม่? การใช้งานมากกว่าที่อื่น ๆ จะสร้างความได้เปรียบหรือไม่? ระบบความปลอดภัยแบบไหนดีกว่ากัน?


4
มีความเป็นไปได้ที่ซ้ำกันของฉันควรใช้ require_once vs include เมื่อใด
Gordon

3
ใช้ "ต้องการ" เสมอ "รวม" สะดวกเหมือนประตูไฟฟ้าในห้องซาวน่า
Marco Mariani

2
@MarcoMariani วิธีนี้จะไม่สะดวก? มันอาจจะชัดเจนฉันแค่ไม่เห็นมัน บางทีไอน้ำเหรอ?
Austin Burk

หากกล่าวไว้อย่างง่าย ๆ ว่าหากไฟล์ 'foo.php' หายไปโดยไม่ตั้งใจฉันต้องการทราบโดยเร็วที่สุดไม่ใช่เมื่อฟังก์ชั่นที่ควรได้รับใน foo.php ถูกเรียกใช้ การใส่คำสั่งแทนที่ด้วยต้องการมักจะสามารถเปิดเผยข้อบกพร่องได้ สมมติว่า config.php ขาดหายไปและแอปพลิเคชันทำงานด้วยการกำหนดค่าเริ่มต้น ระบบความปลอดภัยแบบไหนดีกว่ากัน? สำหรับซาวน่าเมื่อฉันอยู่ข้างในและประตูไม่เปิดด้วยเหตุผลบางอย่างฉันไม่ชอบมัน
Marco Mariani

คำตอบ:


148

คุณพบความแตกต่างที่อธิบายไว้ในคู่มือ PHP แบบละเอียดในหน้าของrequire :

requireเหมือนกับincludeยกเว้นเมื่อล้มเหลวมันจะสร้างE_COMPILE_ERRORข้อผิดพลาดระดับร้ายแรง กล่าวอีกนัยหนึ่งมันจะหยุดสคริปต์ในขณะที่รวมเพียงปล่อยเตือน ( E_WARNING) ซึ่งช่วยให้สคริปต์เพื่อดำเนินการต่อ

ดูคำตอบของ @ efritzสำหรับตัวอย่าง


6
tiposaurus.co.uk/2011/04/04/… "ความแตกต่างหลักระหว่าง require () และ include () คือถ้าคุณต้องการ () ไฟล์ที่ไม่สามารถโหลดได้ (เช่นถ้าไม่มี) มันสร้างข้อผิดพลาดร้ายแรงซึ่งจะหยุดการดำเนินการของหน้าเว็บอย่างสมบูรณ์และจะไม่มีการสร้างผลลัพธ์อีกต่อไปในทางกลับกันหากคุณรวม () ไฟล์ที่ไม่สามารถโหลดได้ สร้างหน้าต่อไป "
stormwild

3
"สิ่งที่คุณควรใช้ขึ้นอยู่กับสถานการณ์นั้นต้องการ () เหมาะที่สุดสำหรับการโหลดไฟล์ที่จำเป็นสำหรับส่วนที่เหลือของหน้าตัวอย่างเช่นถ้าคุณมีเว็บไซต์ที่ขับเคลื่อนด้วยฐานข้อมูลแล้วใช้ require () เพื่อรวมไฟล์ที่มี การเข้าสู่ระบบฐานข้อมูลและรหัสผ่านเป็นที่ต้องการอย่างชัดเจนมากกว่าการใช้การรวม () หากคุณใช้การรวม () ในสถานการณ์เช่นนี้คุณอาจสิ้นสุดการสร้างคำเตือนและข้อผิดพลาดมากกว่าที่คุณต้องการ "
stormwild

3
<?php if (isset($flibbertygibbet)) require 'file.php';ดูเหมือนจะทำให้คำตอบนี้ดูไม่ถูกต้องทั้งหมด มิฉะนั้นฉันควรได้รับข้อผิดพลาดร้ายแรงถึงแม้ว่าเงื่อนไขไม่เป็นความจริง straceไม่แสดง PHP file.phpได้พยายามที่จะสัมผัส
cHao

ไม่เหมือนกับ include (), require () จะอ่านในไฟล์เป้าหมายเสมอถึงแม้ว่าบรรทัดที่บรรทัดนั้นจะไม่ทำงาน หากคุณต้องการรวมไฟล์แบบมีเงื่อนไขให้ใช้ include () และอย่างไรก็ตามหากไม่ได้ดำเนินการบรรทัดที่ต้องการ () เกิดขึ้นจะไม่มีการเรียกใช้โค้ดใด ๆ ในไฟล์เป้าหมาย ดูเหมือนจะพูดในสิ่งที่ตรงกันข้ามหรือฉันเข้าใจผิด?
ไม่มี

1
ความคิดเห็นทั้งหมดเหล่านี้อ้างอิงถึงคำตอบดั้งเดิมนี้ก่อนที่จะถูกแก้ไข แต่เดิมมีการอ้างสิทธิ์ที่ไม่ถูกต้องโดยอ้างว่าif (false) require 'file.php';จะทำให้โหลด 'file.php' (แต่ไม่ได้ดำเนินการ) TLDR ไม่สนใจความคิดเห็นเหล่านี้ทั้งหมด
Kevin Wheeler

181

requireจะโยนข้อผิดพลาดร้ายแรงของ PHP หากไฟล์ไม่สามารถโหลดได้ (การหยุดการทำงาน)

includeสร้างคำเตือนหากไฟล์ไม่สามารถโหลดได้ (การดำเนินการต่อ)

นี่คือภาพประกอบที่ดีของการรวมและต้องการความแตกต่าง :

ป้อนคำอธิบายรูปภาพที่นี่

จาก: ความแตกต่างต้องการเทียบกับรวม php (โดย Robert; Nov 2012)


2
ลิงก์เสียหาย
Michael Peter

5

ใช้includeถ้าคุณไม่รังเกียจสคริปต์ของคุณอย่างต่อเนื่องโดยไม่ต้องโหลดไฟล์ (ในกรณีที่มันไม่มีอยู่ ฯลฯ ) และคุณสามารถ (แม้ว่าคุณจะไม่ควร) อยู่กับข้อความแสดงข้อผิดพลาดคำเตือน

การใช้requireหมายถึงสคริปต์ของคุณจะหยุดถ้าไม่สามารถโหลดไฟล์ที่ระบุและโยนข้อผิดพลาดร้ายแรง


2

ดังที่คนอื่น ๆ ชี้ให้เห็นความแตกต่างเพียงอย่างเดียวคือต้องมีข้อผิดพลาดร้ายแรงและรวมถึง - คำเตือนที่จับได้ สำหรับคนที่จะใช้คำแนะนำของฉันคือการรวมถึง ทำไม? เพราะคุณสามารถเตือนและสร้างความคิดเห็นที่มีความหมายต่อผู้ใช้ปลายทางได้ พิจารณา

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

หมายเหตุ: สำหรับตัวอย่างที่ 2 เพื่อให้ทำงานได้คุณจะต้องติดตั้งตัวจัดการข้อผิดพลาดถึงข้อยกเว้นดังที่อธิบายไว้ที่นี่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");   

ในระดับการรวมไม่เหมาะสำหรับการเรียนรู้ว่าไฟล์ที่คุณคาดหวังไม่ได้มี ไม่มีปัญหาในตัวอย่างของคุณที่จะผลักดันให้ผู้ดูเว็บไซต์ของคุณออกไป
Kzqai

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

ตัวอย่างการปฏิบัติที่ง่ายมากพร้อมรหัส เสียงสะท้อนแรกจะปรากฏขึ้น ไม่ว่าคุณจะใช้การรวมหรือต้องการเนื่องจากการทำงานก่อนหน้าการรวมหรือจำเป็น

เพื่อตรวจสอบผลลัพธ์ในบรรทัดที่สองของรหัสจงใจให้เส้นทางที่ผิดไปยังไฟล์หรือทำผิดพลาดในชื่อไฟล์ ดังนั้นเสียงสะท้อนที่สองที่จะแสดงหรือไม่จะเป็นทั้งหมดขึ้นอยู่กับว่าคุณจะใช้ต้องหรือรวม

ถ้าคุณใช้ต้องการ echo ที่สองจะไม่ดำเนินการ แต่ถ้าคุณใช้รวมถึงไม่ว่าเกิดข้อผิดพลาดอะไรคุณจะเห็นผลลัพธ์ของ echo ที่สองด้วย


-2

ในกรณีของโปรแกรมรวมจะไม่ยุติและแสดงคำเตือนบนเบราว์เซอร์ในทางกลับกันโปรแกรมที่ต้องการจะยุติและแสดงข้อผิดพลาดร้ายแรงในกรณีที่ไม่พบไฟล์


คุณต้องชนคำถามอายุ 2 1/2 ปีเพื่อทำซ้ำคำตอบที่ 2/3 ได้พูดไปแล้วหรือยัง ...
cHao

4
อ๊ะเขาเป็นมือใหม่! อาจไม่เข้าใจแนวคิดของ SO ดังนั้น
Dan Hanly

ผู้ใช้ที่ไม่ดี 2,069222 ตอนนี้เขาออกจาก SO: '(
Gagantous
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.