ความแตกต่างระหว่าง Need, include, require_once และ include_once?


1213

ใน PHP:

  • เมื่อฉันควรใช้requireกับinclude?
  • เมื่อฉันควรใช้require_onceกับinclude_once?

3
PHP CodeSniffer กล่าวว่าหากไฟล์ถูกรวมอยู่ในเงื่อนไขให้ใช้ include_once (แทนที่จะเป็น require_once)
Farhad

คำตอบ:


1426

มีrequireและinclude_onceเช่นกัน

ดังนั้นคำถามของคุณควรเป็น ...

  1. เมื่อฉันควรใช้requireกับinclude?
  2. ฉันควรใช้require_onceกับrequire

คำตอบ 1 อธิบายไว้ที่นี่

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

คำตอบที่ 2 สามารถพบได้ที่นี่

คำสั่ง require_once () จะเหมือนกับคำสั่ง require () ยกเว้น PHP จะตรวจสอบว่าไฟล์นั้นถูกรวมไว้แล้วหรือไม่และถ้าใช่ไม่รวม (ต้องการ) อีกครั้ง


58
ใจที่ต้องการ () ดำเนินการเร็วกว่า require_once () ดังนั้นหากคุณแน่ใจว่าไม่มีการทำซ้ำรวมถึงการใช้ require ()
dialex

48
@DiAlex, require_once ช้ากว่า แต่แทบจะไม่สามารถวัดได้
ศ. Falken ผิดสัญญา

77
@DiAlex ... และหากปรากฎว่าไฟล์นั้นรวมอยู่ในความเป็นจริงแล้วrequire_once()จะเร็วกว่าของทั้งสอง
Tom

11
@ Prof.Falken ในสถานการณ์ใดที่จำเป็นต้องใช้ไฟล์เดียวกันมากกว่าหนึ่งครั้ง ?? ฉันไม่สามารถนึกถึงสิ่งใดสิ่งหนึ่งภายในความคิดปัจจุบัน
Weishi Zeng

17
@WeishiZeng สำหรับหน้าเว็บอาจมีตัวอย่าง HTML ที่คุณต้องการรวมไว้มากกว่าหนึ่งครั้ง
James Beninger

406

ใช้

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

  • require_once
    เมื่อไฟล์มีเนื้อหาที่จะก่อให้เกิดข้อผิดพลาดในการรวมภายหลังเช่น function important() { /* important code */}จำเป็นในแอปพลิเคชันของคุณ แต่เนื่องจากไม่สามารถรวมฟังก์ชันที่ไม่สามารถประกาศใหม่ได้

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

  • การ
    พึ่งพาทางเลือกinclude_onceที่จะทำให้เกิดข้อผิดพลาดในการโหลดในภายหลังหรืออาจรวมไฟล์ระยะไกลที่คุณไม่ต้องการให้เกิดขึ้นสองครั้งเนื่องจากค่าใช้จ่าย HTTP

แต่โดยพื้นฐานแล้วขึ้นอยู่กับคุณว่าจะใช้เมื่อไร


ฉันมี PDO การเชื่อมต่อ(ไปยังฐานข้อมูล) ฉันควรใช้อันไหนดี include? include_once? require? require_once?
Shafizadeh

6
นี่ควรเป็นคำตอบที่ได้รับการยอมรับเนื่องจากมันตอบคำถามสั้น ๆ และลิงก์ไปยังคู่มืออย่างเป็นทางการแทนที่จะเป็นคำตอบอื่น ๆ ที่เชื่อมโยงกับ w3schools เท่านั้น
Daniel W.

9
โปรดบอกเหตุผลว่าทำไมคุณถึงรวมมันหากไม่จำเป็น
Francisco Ochoa

1
ฉันใช้เทมเพลตสำหรับเลย์เอาต์ของหน้าทั่วไปที่มีส่วนต่างๆเช่นส่วนหัวคอลัมน์ส่วนท้าย ฯลฯ สิ่งนี้ทำให้ฉันสามารถให้บริการเทมเพลตนั้นสำหรับทุกหน้าในเว็บไซต์และฉันต้องการสร้างไฟล์ในโครงสร้างโฟลเดอร์หน้าซึ่งกำหนด ควรเข้าไปในแต่ละตำแหน่งเหล่านั้น หากฉันตัดสินใจว่าหน้าเว็บไม่จำเป็นต้องใช้แถบด้านข้างฉันเพียงแค่ทิ้งไฟล์นั้นไว้ในโฟลเดอร์สำหรับหน้านั้นและเทมเพลตก็ยังใช้งานได้โดยไม่ต้องมีไฟล์นั้นอยู่
James Coyle

301

คำแนะนำของฉันคือใช้เพียงrequire_once99.9% ของเวลา

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

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

หากคุณกำลังทำ OO หรือฟังก์ชั่นการเขียนโปรแกรมอยู่แล้วการใช้งานinclude_onceส่วนใหญ่จะล่าช้าซึ่งในสแต็กคุณพบข้อบกพร่อง / ข้อผิดพลาด คุณต้องการที่จะรู้ว่าฟังก์ชั่นdo_cool_stuff()ไม่สามารถใช้งานได้เมื่อคุณไปที่จะโทรหามันในภายหลังหรือช่วงเวลาที่คุณคาดว่าจะสามารถใช้ได้โดยต้องการห้องสมุด? require_onceโดยทั่วไปจะดีที่สุดที่จะรู้ได้ทันทีว่าสิ่งที่คุณต้องการและคาดหวังว่าจะไม่สามารถใช้ได้ดังนั้นเพียงแค่การใช้งาน

หรือใน OOP สมัยใหม่เพียงแค่โหลดคลาสของคุณเองเมื่อใช้งาน


41
+1 นี่คือคำตอบที่ได้รับการยอมรับ ประเด็นสำคัญอยู่ที่ว่าincludeครอบครัวมักจะมีความคิดที่ไม่ดีตรงไปตรงมา (เพราะมันหายากสวยที่จะรวมถึงไฟล์ที่มีความเป็นไปได้ของไม่ได้มีอยู่ในปัจจุบัน) และออกจากที่require_onceและrequireคุณควรใช้require_onceเมื่อรวมถึงไฟล์ที่กำหนดฟังก์ชั่นหรือชั้นเรียนที่จะเป็น ใช้ที่อื่นหรือยกตัวอย่างซิงเกิลตันเช่นวัตถุเชื่อมต่อฐานข้อมูลและใช้requireสำหรับการรวมไฟล์ที่ทำสิ่งต่าง ๆทันทีเมื่อรวมเข้าด้วยกัน ในแอปพลิเคชันเว็บขนาดใหญ่การรวมประเภทหลังนั้นผิดปกติ
Mark Amery

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

เฮ้ฉันมีไฟล์ซึ่งบางครั้งก็รวมอยู่ในหน้าดัชนีและเวลาคนเรียกว่าโดยตรง (home.php) ........... ตอนนี้ฉันรวมแล้วไฟล์ config ในหน้าดัชนีที่มีฟังก์ชั่นต้องการตอนนี้ฉันสามารถใช้ require_once ใน home.php เพื่อป้องกันไม่ให้รวมถึงอีกครั้ง
Ravinder Payal

@RavinderPayal คำแนะนำแรกของฉันคือช่วยให้คุณปวดหัวโดยใช้ front-controller! เพียงเพราะผู้ใช้โทรไปที่ example.com/home ไม่ได้หมายความว่าคุณควรมี home.php แยกกันโดยสิ้นเชิง! แทน / home / ควรกำหนดเส้นทางผ่านตัวควบคุมด้านหน้าของ index.php หรือ front.php มีเพียง php เท่านั้นที่อนุญาตให้ oldschool "หนึ่งสคริปต์ต่อหน้า" เข้าหาและเชื่อใจฉันมันไม่ใช่วิธีที่ดีที่สุด แต่ถ้าคุณต้องมี home.php และ index.php แยกต่างหากสิ่งใดก็ตามที่อาจเข้าสู่ทั้งสองควรอยู่ในไฟล์ไลบรารีหรือเทมเพลต ../templates/home.tpl หรือ ../view/home.view.php คุณรู้?
Kzqai

SNS และฉันเลือกหนึ่งไฟล์วิธีหนึ่งหน้าแรกเริ่มต้นสำหรับการพัฒนาง่ายและมันเป็นสแต็คขนาดใหญ่ของไฟล์ที่ฉันไม่สามารถสร้างและตอนนี้ฉันแก้ไขปัญหานั้นและเหตุผลอื่น ๆ ในการทำหนึ่งไฟล์หน้าเดียวคือความเร็วและการติดต่อน้อยกับฮาร์ดดิสก์โดย จำนวนที่ลดลงของรวม
Ravinder Payal

36

ความแตกต่างระหว่างฟังก์ชั่น _once และไม่มีฟังก์ชั่น _once: ไม่มีรหัส _once จะรวมอีกครั้งในขณะที่ฟังก์ชั่น _once PHP ติดตามไฟล์ที่รวมอยู่และจะรวมเพียงครั้งเดียว

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


1
ว้าวสั้นและเรียบง่าย!

31

include() จะส่งคำเตือนหากไม่สามารถรวมไฟล์ได้ แต่สคริปต์ที่เหลือจะทำงาน

require()จะโยนE_COMPILE_ERRORและหยุดสคริปต์หากไม่สามารถรวมไฟล์ได้

include_once()และrequire_once()ฟังก์ชั่นจะไม่รวมไฟล์เป็นครั้งที่สองถ้ามันได้รับการรวมอยู่แล้ว

ดูหน้าเอกสารประกอบต่อไปนี้:


22

เมื่อใดก็ตามที่คุณกำลังใช้งานrequire_once()สามารถใช้ในไฟล์เพื่อรวมไฟล์อื่นเมื่อคุณต้องการไฟล์ที่เรียกว่าเพียงครั้งเดียวในไฟล์ปัจจุบัน ในตัวอย่างฉันมี test1.php

<?php  
echo "today is:".date("Y-m-d");  
?>  

และในไฟล์อื่นที่ฉันตั้งชื่อ test2.php

<?php  
require_once('test1.php');  
require_once('test1.php');  
?>

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

เมื่อใดก็ตามที่คุณใช้ 'include_once () `สามารถใช้ในไฟล์เพื่อรวมไฟล์อื่นเมื่อคุณต้องการไฟล์ที่ถูกเรียกมากกว่าหนึ่งครั้งในไฟล์ปัจจุบัน ในตัวอย่างนี้ฉันมีไฟล์ชื่อ test3.php

<?php  
echo "today is:".date("Y-m-d");  
?> 

และในไฟล์อื่นที่ฉันตั้งชื่อว่า test4.php

<?php  
include_once('test3.php');  
include_once('test3.php');  
?>

ในขณะที่คุณกำลังดูไฟล์ m รวมถึงไฟล์ test3 จะรวมไฟล์ในครั้งเดียว แต่หยุดการทำงานต่อไป


'ตัวอย่างดีกว่าคำแนะนำ'
Ramesh Kithsiri HettiArachchi

19

ใช้ "รวม" สำหรับเทมเพลตPHP ที่ใช้ซ้ำได้ ใช้ "ต้องการ" สำหรับห้องสมุดที่ต้องการ

"* _once" เป็นสิ่งที่ดีเพราะมันตรวจสอบว่าไฟล์นั้นโหลดมาแล้วหรือไม่ แต่มันสมเหตุสมผลสำหรับฉันใน "require_once"


18

คุณควรจัดระเบียบคลาสและฟังก์ชั่นการจัดระเบียบในไฟล์

ใช้require_once()สำหรับโหลดการอ้างอิง (คลาส, ฟังก์ชัน, ค่าคงที่)

ใช้require()ในการโหลดแม่แบบเช่นไฟล์

ใช้include_once()เพื่อโหลดการพึ่งพาที่เป็นทางเลือก (คลาส, ฟังก์ชั่น, ค่าคงที่)

ใช้include()ในการโหลดตัวเลือกแม่แบบเช่นไฟล์


16

คำตอบหลังจาก 7 ปีสำหรับปี 2018

คำถามนี้ถูกถามเมื่อเจ็ดปีที่แล้วและไม่มีคำตอบใดที่ให้ความช่วยเหลือในทางปฏิบัติสำหรับคำถาม ในการเขียนโปรแกรม PHP สมัยใหม่ส่วนใหญ่คุณจะใช้required_onceเพียงครั้งเดียวเพื่อรวมคลาส autoloader ของคุณ (บ่อยครั้งที่นักแต่งเพลงอัตโนมัติ) และมันจะโหลดคลาสและฟังก์ชั่นทั้งหมดของคุณ (ไฟล์ฟังก์ชั่นจำเป็นต้องเพิ่มcomposer.jsonไฟล์ลงในไฟล์ หากเหตุผลใดก็ตามที่คลาสของคุณไม่สามารถโหลดได้จากออโต้โหลดคุณใช้require_onceในการโหลด

requireมีบางครั้งที่เราจำเป็นต้องใช้เป็น ตัวอย่างเช่นถ้าคุณมีนิยามอาร์เรย์ขนาดใหญ่มากและคุณไม่ต้องการเพิ่มสิ่งนี้ลงในซอร์สโค้ดคำจำกัดความของคลาสคุณสามารถ:

 <?php
// arr.php
return ['x'=>'y'];

 <?php
//main.php
$arr= require 'arry.php'

หากไฟล์ที่คุณตั้งใจจะใส่มีสิ่งที่เรียกใช้งานได้หรือประกาศตัวแปรบางอย่างที่คุณเกือบจะต้องใช้requireเพราะถ้าคุณใช้require_onceนอกเหนือจากที่แรกรหัสของคุณจะไม่ถูกเรียกใช้และ / หรือตัวแปรของคุณจะไม่เริ่มต้นอย่างเงียบ ๆ เป็นการยากที่จะระบุ

ไม่มีกรณีการใช้งานจริงincludeและinclude_once


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

นอกจากนี้ยังมีตัวแก้ไขข้อความที่ทันสมัยและ PHP ที่ทันสมัยเกือบจะไม่มีใครใช้require()เพื่อแยกไฟล์ขนาดใหญ่
Haz

ฉันประสบปัญหาเดียวกันเมื่อใช้require_onceสำหรับ PHPMailer ภายในฟังก์ชั่นและ autoloader ของฉันกำหนด$mailตัวแปรที่จำเป็นในภายหลังในรหัสดังนั้นต่อไปrequire_onceได้รับการละเว้นซึ่งเหลือ$mailไม่ได้เริ่มต้น! การแก้ปัญหาคือการใช้เพียงrequireหลังจากการเรียกใช้ฟังก์ชัน
Youssef

@haz มีเหตุผลใดที่คุณไม่ได้ใช้requireในกรณีเหล่านั้นหรือไม่?
PHPst

@ChristofferBubach LOL
PHPst

15

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

require()เหมือนกับinclude() ยกเว้นเมื่อล้มเหลวมันจะสร้างE_ERROR ข้อผิดพลาดระดับร้ายแรง

includeสร้างE_WARNINGข้อผิดพลาดเฉพาะถ้าล้มเหลวซึ่งมากกว่าหรือน้อยกว่าที่เงียบ

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


สำหรับ*_once():

include_once() อาจใช้ในกรณีที่ไฟล์เดียวกันอาจรวมอยู่และประเมินมากกว่าหนึ่งครั้งในระหว่างการเรียกใช้สคริปต์โดยเฉพาะดังนั้นในกรณีนี้มันอาจช่วยหลีกเลี่ยงปัญหาต่าง ๆ เช่นการกำหนดฟังก์ชันการกำหนดค่าตัวแปรใหม่ ฯลฯ

เช่นเดียวกับrequire_once()หลักสูตร


ข้อมูลอ้างอิง: require(),include_once()


requireให้ E_COMPILE_ERROR ไม่ใช่ E_ERROR
Yousha Aleayoub

ดูเหมือนว่าจะเปลี่ยนไปในช่วง 7 ปีที่ผ่านมา
เฟลิกซ์คลิง

9

ด้วยต้องมีไฟล์จะต้องมีอยู่ถ้ามันไม่ได้แล้วข้อผิดพลาดจะแสดง; ในขณะที่รวมถึง - หากไฟล์ไม่อยู่แล้วหน้าจะโหลดต่อไป


8

ต้องการส่วนที่สำคัญเช่นการให้สิทธิ์และรวมถึงส่วนอื่น ๆ ทั้งหมด

การรวมหลายรายการเป็นการออกแบบที่แย่มากและต้องหลีกเลี่ยงเลย ดังนั้น * _once ไม่สำคัญ


7

รวม / ต้องการคุณสามารถรวมไฟล์เดียวกันมากกว่าหนึ่งครั้งด้วย:

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

require_once / include_once

เหมือนกันกับการรวม / ต้องการยกเว้น PHP จะตรวจสอบว่าไฟล์นั้นถูกรวมไว้แล้วหรือไม่และถ้าใช่ไม่รวม (จำเป็น) อีกครั้ง


5

include()จะสร้างคำเตือนเมื่อไม่พบไฟล์ แต่require_once()จะสร้างข้อผิดพลาดร้ายแรง

อีกอย่างคือถ้ารวมไฟล์ไว้ก่อนหน้านี้ จากนั้นrequire_once()จะไม่รวมไว้อีกครั้ง


5

ฉันใช้ฟังก์ชั่นดังนี้:

function doSomething() {
    require_once(xyz.php);
    ....
}

มีค่าคงที่ที่ประกาศใน xyz.php

ฉันต้องเรียกใช้ฟังก์ชัน doSomething () นี้จากไฟล์สคริปต์ PHP อื่น

แต่ฉันสังเกตพฤติกรรมในขณะที่เรียกใช้ฟังก์ชันนี้ในลูปสำหรับการทำซ้ำครั้งแรก doSomething () กำลังรับค่าคงที่ภายในxyz.phpแต่หลังจากนั้นการวนซ้ำทุกครั้งdoSomething()จะไม่สามารถรับค่าคงที่ที่ประกาศไว้xyz.phpได้

ฉันจะแก้ไขปัญหาของฉันโดยเปลี่ยนจากrequire_once()การinclude()ปรับปรุงdoSomething()รหัสจะเป็นด้านล่าง:

function doSomething() {
    include(xyz.php);
    ....
}

ตอนนี้ทุกสายย้ำจะได้รับค่าคงที่ที่กำหนดไว้ในdoSomething()xyz.php


4

จากคู่มือ :

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

เช่นเดียวกันกับ_once()ตัวแปร


4

ในยุคของออPSR-0 / PSR-4โต้โหลดอาจไม่จำเป็นอย่างสมบูรณ์ที่จะใช้คำสั่งใด ๆ หากคุณต้องการให้ฟังก์ชั่น / คลาสพร้อมใช้งานสำหรับโค้ดของคุณ (แน่นอนว่าคุณยังคงต้องrequire_onceโหลดอัตโนมัติในไฟล์บูทสแตรปและincludeแม่แบบ ยังคงใช้ PHP เป็นเครื่องมือแม่แบบ)


3

 

  1. เมื่อหนึ่งควรใช้requireหรือinclude?

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

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

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

  2. เมื่อหนึ่งควรใช้require_onceหรือrequire?

    ความแตกต่างขั้นพื้นฐานระหว่างrequireและrequire_onceคือrequire_onceจะตรวจสอบว่าไฟล์จะถูกรวมอยู่หรือไม่ถ้ามันจะรวมอยู่แล้วมันจะไม่รวมไฟล์ในขณะที่requireฟังก์ชั่นจะรวมไฟล์โดยไม่คำนึงถึงว่าไฟล์จะถูกรวมไว้แล้วหรือไม่

    ดังนั้นในกรณีที่คุณต้องการรวมชิ้นส่วนของรหัสบางอีกครั้งและอีกครั้งใช้ฟังก์ชั่นในขณะที่ถ้าคุณต้องการรวมโค้ดบางเพียงครั้งเดียวในรหัสของคุณใช้requirerequire_once


2
  1. ใช้ต้องการฟังก์ชั่นเมื่อคุณต้องการโหลดคลาสฟังก์ชั่นหรือการพึ่งพาใด ๆ

  2. ใช้ฟังก์ชั่นincludeเมื่อคุณต้องการโหลดไฟล์สไตล์เทมเพลต

หากคุณยังสับสนอยู่ให้ใช้require_onceตลอดเวลา


1

เป็นวิธีรวมไฟล์ทั้งหมด

จำเป็นต้องใช้หมายความว่ามันต้องการมัน Require_once หมายความว่าจะต้องใช้ แต่ต้องการเพียงครั้งเดียวเท่านั้น รวมถึงหมายความว่ามันจะรวมไฟล์ แต่ไม่ต้องการให้ดำเนินการต่อ

ตัวอย่าง:

Require 'filename'
Require_once 'filename'
Include 'filename'

นอกจากนี้ยังมีฟังก์ชั่น include_once ซึ่งรวมไฟล์หนึ่งครั้ง

Include_once 'filename'

อย่าใช้อักษรตัวใหญ่ที่ฉันมีในขณะที่ฉันพิมพ์จากโทรศัพท์ของฉัน


1

สิ่งหนึ่งที่ฉันสังเกตเห็นเมื่อใช้ include ฉันสามารถเข้าถึงได้เฉพาะฟังก์ชั่นไฟล์ที่รวมไว้จากไฟล์ที่รวมไว้เท่านั้น ด้วย require_once ฉันสามารถเรียกใช้ฟังก์ชันนั้นในไฟล์ require_once ที่สอง

ยัง: ฉันแนะนำให้เพิ่ม

if(file_exists($RequiredFile)){
    require_once($RequiredFile);
}else{
  die('Error: File Does Not Exist');
}

เพราะเมื่อ require_once ฆ่าหน้าบางครั้งก็สามารถสะท้อนไดเรกทอรีของไฟล์เว็บไซต์ของคุณ

นี่เป็นฟังก์ชั่นที่กำหนดเองที่ฉันทำเพื่อต้องการไฟล์:

function addFile($file, $type = 'php', $important=false){
    //site-content is a directory where I store all the files that I plan to require_once
    //the site-content directory has "deny from all" in its .htaccess file to block direct connections
    if($type && file_exists('site-content/'.$file.'.'.$type) && !is_dir('site-content/'.$file.'.'.$type)){
        //!is_dir checks that the file is not a folder
        require_once('site-content/'.$file.'.'.$type);
        return 'site-content/'.$file.'.'.$type;
    }else if(!$type && file_exists('site-content/'.$file) && !is_dir('site-content/'.$file)){
        //if you set "$type=false" you can add the file type (.php, .ect) to the end of the "$file" (useful for requiring files named after changing vars)
        require_once('site-content/'.$file);
        return 'site-content/'.$file;
    }else if($important){
        //if you set $important to true, the function will kill the page (which also prevents accidentally echoing the main directory path of the server)
        die('Server Error: Files Missing');
        return false;
    }else{
        //the function returns false if the file does not exist, so you can check if your functions were successfully added
        return false;
    }
}

ตัวอย่างการใช้งาน:

$success = addFile('functions/common');

if($success){
    commonFunction();
}else{
    fallbackFunction();
}

0

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

จากคำภาษาอังกฤษที่ต้องการ PHP จะบอกว่าการดำเนินการของหน้าหรือไฟล์ขึ้นอยู่กับไฟล์ที่ต้องการ

จากประสบการณ์ของฉันมันเป็นเรื่องปกติที่ต้องใช้ไฟล์ที่สำคัญเช่นไฟล์กำหนดค่าคลาสฐานข้อมูลและยูทิลิตี้ที่สำคัญอื่น ๆ


0

บ่อยครั้งที่คุณต้องการโหลดไลบรารี่ของลูกค้าแบบมีเงื่อนไขหรือไปข้างหน้าและโหลดว่าคุณจะใช้งานหรือไม่

นี่คือตัวอย่างที่เป็นรูปธรรม; อธิบายเพิ่มเติมเกี่ยวกับสิ่งที่ pcj พูด

สมมติว่าคุณมีไฟล์กำหนดค่าที่จัดเก็บชื่อผู้ใช้และรหัสผ่านฐานข้อมูล (conf.php):

<?php
//my site configuration file

//For Database
$location='localhost';
$dbuser='yourname';
$userpw='yourpassword';
$database='nameofdatabase';
?>

และคลาสที่มีฟังก์ชั่นสแตติกที่ใช้ฐานข้อมูล:

<?php
class UsedInLoop {
    public static function databaseQuery(){
        require(/path/to/conf.php);                //require_once will not work here
        $db = new mysqli($location, $dbuser, $userpw, $database);
        //yada yada yada
    }
}
?>

และฟังก์ชั่นแบบคงที่นั้นใช้ภายในฟังก์ชั่นอื่นที่ถูกเรียกซ้ำภายในวง:

<?php
require_once('path/to/arbitraryObject.php');  //either will likely be OK at this level
$obj = new arbitraryObject();
foreach($array as $element){
    $obj->myFunction();
}
?>

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

<?php
class arbitraryObject {
    public function myFunction(){
        require_once(/path/to/UsedInLoop.php);   //This must be require_once. require() will not work
        UsedInLoop::databaseQuery();
    }
}
?>

แน่นอนว่าการย้ายออกไปนอกฟังก์ชั่นอาจเป็นวิธีแก้ปัญหาดังกล่าว:

<?php
require(/path/to/UsedInLoop.php);   //now require() is fine   
class arbitraryObject {
    public function myFunction(){
        UsedInLoop::databaseQuery();
    }
}
?>

ยกเว้นกรณีที่คุณกังวลเกี่ยวกับค่าใช้จ่ายในการโหลดคลาสที่อาจใช้ในเงื่อนไขบางอย่างเท่านั้นและไม่ต้องการโหลดเมื่อไม่มี


-1

requireมีค่าใช้จ่ายสูงกว่าincludeเนื่องจากต้องแยกวิเคราะห์ไฟล์ก่อน การแทนที่requiresด้วยincludesมักเป็นเทคนิคการเพิ่มประสิทธิภาพที่ดี


2
ฉันรู้ว่ามันเป็นความคิดเห็นที่ล่าช้า แต่จริง ๆ แล้วมันไม่จริง requireไม่แยกวิเคราะห์ไฟล์อีกincludeต่อไป _onceรุ่นของฟังก์ชั่นเหล่านั้นแต่ละคนมีบิตของค่าใช้จ่าย แต่เช่นเดียวกับคนอื่น ๆ ได้กล่าวว่ามันใกล้กับเล็กน้อยในการใช้งานมากที่สุด
ahouse101

-2

เพียงใช้ต้องการและรวมถึง

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

if (!defined(php)) {
    include 'php';
    define(php, 1);
}

แค่ใช้แบบนี้ ...

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