Trong PHP:
- Khi nào tôi nên sử dụng
require
so vớiinclude
? - Khi nào tôi nên sử dụng
require_once
so vớiinclude_once
?
Trong PHP:
require
so với include
?require_once
so với include_once
?Câu trả lời:
Có require
và include_once
là tốt.
Vì vậy, câu hỏi của bạn nên ...
require
so với include
?require_once
vs.require
Câu trả lời cho 1 được mô tả ở đây .
Hàm Yêu cầu () giống hệt với hàm (), ngoại trừ việc nó xử lý các lỗi khác nhau. Nếu xảy ra lỗi, hàm include () tạo cảnh báo, nhưng tập lệnh sẽ tiếp tục thực thi. Yêu cầu () tạo ra một lỗi nghiêm trọng và tập lệnh sẽ dừng lại.
Câu trả lời cho 2 có thể được tìm thấy ở đây .
Câu lệnh allow_once () giống hệt với request () ngoại trừ PHP sẽ kiểm tra xem tệp đã được bao gồm chưa, và nếu vậy, không bao gồm (yêu cầu) nó một lần nữa.
require_once()
sẽ nhanh hơn cả hai
Sử dụng
yêu cầu
khi tệp được yêu cầu bởi ứng dụng của bạn, ví dụ: mẫu tin nhắn quan trọng hoặc tệp chứa biến cấu hình mà không có ứng dụng sẽ phá vỡ.
Yêu cầu
khi tệp chứa nội dung sẽ gây ra lỗi trong lần đưa vào tiếp theo, ví dụ:
function important() { /* important code */}
chắc chắn là cần thiết trong ứng dụng của bạn nhưng vì các chức năng không thể được khai báo lại nên không được đưa vào lại.
bao gồm
khi tệp không bắt buộc và luồng ứng dụng sẽ tiếp tục khi không tìm thấy, ví dụ:
tuyệt vời cho các mẫu tham chiếu các biến từ phạm vi hiện tại hoặc một cái gì đó
include_once
phụ thuộc tùy chọn sẽ tạo ra lỗi trong lần tải tiếp theo hoặc có thể bao gồm tệp từ xa mà bạn không muốn xảy ra hai lần do chi phí HTTP
Nhưng về cơ bản, tùy thuộc vào bạn khi nào nên sử dụng.
include
? include_once
? require
? require_once
?
Đề nghị của tôi là chỉ sử dụng require_once
99,9% thời gian.
Sử dụng require
hoặc include
thay vào đó ngụ ý rằng mã của bạn không thể tái sử dụng ở nơi khác, tức là các tập lệnh bạn đang thực hiện thực thi mã thay vì cung cấp một lớp hoặc một số thư viện hàm.
Nếu bạn được yêu cầu / bao gồm mã thực thi tại chỗ, đó là mã thủ tục và bạn cần tìm hiểu một mô hình mới . Giống như lập trình hướng đối tượng, lập trình dựa trên chức năng hoặc lập trình chức năng.
Nếu bạn đã thực hiện OO hoặc lập trình chức năng, việc sử dụng include_once
chủ yếu sẽ bị trì hoãn ở nơi trong ngăn xếp bạn tìm thấy lỗi / lỗi. Bạn có muốn biết rằng chức năng do_cool_stuff()
này không khả dụng khi bạn gọi cho nó sau, hoặc thời điểm mà bạn mong đợi nó có sẵn bằng cách yêu cầu thư viện? Nói chung, tốt nhất là nên biết ngay nếu thứ bạn cần và mong đợi không có sẵn, vì vậy hãy sử dụng require_once
.
Ngoài ra, trong OOP hiện đại, chỉ cần tự động tải các lớp của bạn khi sử dụng.
include
gia đình là thường là một ý tưởng hoàn toàn xấu (vì nó khá hiếm được bao gồm các file có bất kỳ khả năng không tồn tại), và đó ra khỏi require_once
và require
, bạn nên sử dụng require_once
khi bao gồm các file đó xác định các chức năng hoặc các lớp học được được sử dụng ở nơi khác hoặc khởi tạo các singletons như các đối tượng kết nối cơ sở dữ liệu và sử dụng require
để bao gồm các tệp ngay lập tức thực hiện công cụ khi chúng được đưa vào. Trong bất kỳ ứng dụng web lớn nào, loại bao gồm sau là không bình thường.
require_once
rất có thể ứng cử viên sẽ được sử dụng gần như mọi lúc. Do sự khác biệt nhỏ giữa các lựa chọn, require
đảm bảo dừng tập lệnh, tôi không thể nghĩ ra nhiều tình huống trong đó một ứng dụng có thể tồn tại mà không có tệp nào được đưa vào. Và _once
bảo vệ khỏi các vấn đề dupe. Bất cứ ai không đồng ý đều có thể biết những gì họ đang làm có thể chọn bất kỳ ứng dụng nào phù hợp với ứng dụng hoặc kịch bản.
Sự khác biệt giữa các hàm _once và không có các hàm _once: không có mã _once sẽ được đưa vào một lần nữa trong khi với các hàm _once PHP theo dõi các tệp được bao gồm và sẽ chỉ bao gồm một lần.
Sự khác biệt giữa yêu cầu và bao gồm: Nếu không tìm thấy tệp yêu cầu, PHP sẽ phát ra lỗi nghiêm trọng trong khi chỉ bao gồm cảnh báo sẽ được phát ra.
include()
sẽ đưa ra cảnh báo nếu không thể bao gồm tệp, nhưng phần còn lại của tập lệnh sẽ chạy.
require()
sẽ ném E_COMPILE_ERROR
và tạm dừng tập lệnh nếu nó không bao gồm tệp.
Các chức năng include_once()
và require_once()
sẽ không bao gồm tệp lần thứ hai nếu nó đã được bao gồm.
Xem các trang tài liệu sau:
Bất cứ khi nào bạn đang sử dụng require_once()
có thể được sử dụng trong một tệp để bao gồm một tệp khác khi bạn cần tệp được gọi chỉ một lần duy nhất trong tệp hiện tại. Ở đây trong ví dụ tôi có một test1.php.
<?php
echo "today is:".date("Y-m-d");
?>
và trong một tệp khác mà tôi đã đặt tên test2.php
<?php
require_once('test1.php');
require_once('test1.php');
?>
vì bạn đang xem m yêu cầu tệp test1 hai lần nhưng tệp sẽ bao gồm test1 một lần và để gọi lần thứ hai, điều này sẽ bị bỏ qua. Và không dừng lại sẽ hiển thị đầu ra một lần duy nhất.
Bất cứ khi nào bạn đang sử dụng 'include_once () `có thể được sử dụng trong một tệp để bao gồm một tệp khác khi bạn cần tệp được gọi nhiều lần trong tệp hiện tại. Ở đây trong ví dụ tôi có một tệp có tên test3.php.
<?php
echo "today is:".date("Y-m-d");
?>
Và trong một tập tin khác mà tôi đã đặt tên là test4.php
<?php
include_once('test3.php');
include_once('test3.php');
?>
vì bạn đang xem m bao gồm tệp test3 sẽ bao gồm tệp một lần nhưng tạm dừng thực hiện thêm.
Bạn nên giữ các định nghĩa lớp và chức năng được tổ chức trong các tệp.
Sử dụng require_once()
để tải phụ thuộc (lớp, hàm, hằng).
Sử dụng require()
để tải các tệp giống như mẫu .
Sử dụng include_once()
để tải các phụ thuộc tùy chọn (các lớp, hàm, hằng).
Sử dụng include()
để tải các tệp giống như mẫu tùy chọn .
Câu hỏi này đã được hỏi bảy năm trước, và không có câu trả lời nào cung cấp trợ giúp thiết thực cho câu hỏi. Trong lập trình PHP hiện đại, bạn chủ yếu required_once
chỉ sử dụng một lần để bao gồm lớp trình tải tự động của bạn (trình tải tự động của trình soạn thảo thường xuyên) và nó sẽ tải tất cả các lớp và hàm của bạn (các tệp chức năng cần được thêm rõ ràng vào composer.json
tệp để có sẵn trong tất cả các tệp khác). Nếu vì bất kỳ lý do nào, lớp của bạn không thể tải được từ trình tải tự động mà bạn sử dụng require_once
để tải nó.
Có một số dịp chúng ta cần sử dụng require
. Ví dụ: nếu bạn có một định nghĩa mảng thực sự lớn và bạn không muốn thêm nó vào mã nguồn định nghĩa lớp, bạn có thể:
<?php
// arr.php
return ['x'=>'y'];
<?php
//main.php
$arr= require 'arry.php'
Nếu tệp bạn định đưa vào chứa thứ gì đó có thể thực thi được hoặc khai báo một số biến bạn hầu như luôn cần sử dụng require
, bởi vì nếu bạn sử dụng require_once
ngoài vị trí đầu tiên, mã của bạn sẽ không được thực thi và / hoặc các biến của bạn sẽ không khởi động âm thầm, gây ra lỗi là hoàn toàn khó để xác định chính xác.
Không có trường hợp sử dụng thực tế cho include
và include_once
thực sự.
include()
bộ đệm đầu ra để triển khai công cụ tạo khuôn mẫu của mình.
require()
để phân chia các tệp lớn.
require_once
cho PHPMailer bên trong một hàm và trình tải tự động của tôi xác định $mail
biến cần thiết sau này trong mã, do đó, cái tiếp theo require_once
bị bỏ qua, $mail
không được khởi tạo! giải pháp đơn giản là sử dụng require
sau khi gọi hàm.
require
trong những trường hợp đó không?
Sự khác biệt là trong lỗi các lệnh tạo ra. Với require
, tập tin bạn muốn sử dụng thực sự cần thiết và do đó sẽ tạo ra E_ERROR
nếu không tìm thấy.
require()
là giống hệt nhưinclude()
ngoại trừ khi thất bại, nó cũng sẽ tạo ra mộtE_ERROR
lỗi nghiêm trọng .
include
chỉ tạo ra một E_WARNING
lỗi nếu nó không hoạt động.
Vì vậy, sử dụng nó nếu tập tin được yêu cầu để làm cho mã còn lại hoạt động và bạn muốn tập lệnh không thành công tập tin.
Dành cho *_once()
:
include_once()
có thể được sử dụng trong trường hợp cùng một tệp có thể được bao gồm và đánh giá nhiều lần trong khi thực thi tập lệnh cụ thể, vì vậy trong trường hợp này, nó có thể giúp tránh các vấn đề như xác định lại chức năng, xác định lại giá trị biến, v.v.
require_once()
Tất nhiên áp dụng cho tất nhiên.
Tham khảo: require()
,include_once()
require
cung cấp cho E_COMPILE_ERROR, không phải E_ERROR.
Yêu cầu các phần quan trọng, như ủy quyền và bao gồm tất cả những người khác.
Nhiều bao gồm chỉ là thiết kế rất xấu và phải tránh tất cả. Vì vậy, * _once không thực sự quan trọng.
Bao gồm / Yêu cầu bạn có thể bao gồm cùng một tệp nhiều lần:
Yêu cầu () giống hệt với bao gồm () trừ khi thất bại, nó cũng sẽ tạo ra lỗi cấp độ E_COMPILE_ERROR nghiêm trọng. Nói cách khác, nó sẽ tạm dừng tập lệnh trong khi bao gồm () chỉ phát ra cảnh báo (E_WARNING) cho phép tập lệnh tiếp tục.
là giống hệt với bao gồm / yêu cầu ngoại trừ PHP sẽ kiểm tra xem tệp đã được bao gồm chưa và nếu có, không bao gồm (yêu cầu) lại.
include()
sẽ tạo cảnh báo khi không tìm thấy tệp nhưng require_once()
sẽ tạo ra lỗi nghiêm trọng.
Một điều nữa là nếu tập tin được bao gồm trước đó. Sau đó require_once()
sẽ không bao gồm nó một lần nữa.
Tôi đã sử dụng chức năng như dưới đây:
function doSomething() {
require_once(xyz.php);
....
}
Có các giá trị không đổi được khai báo trong xyz.php.
Tôi phải gọi hàm doS Something () này từ một tệp script PHP khác.
Nhưng tôi đã quan sát hành vi trong khi gọi hàm này trong một vòng lặp, vì lần lặp đầu tiên doS Something () đã nhận được các giá trị không đổi bên trong xyz.php
, nhưng sau đó mỗi lần lặp lại doSomething()
không thể nhận được các giá trị không đổi được khai báo xyz.php
.
Tôi đã giải quyết vấn đề của mình bằng cách chuyển từ require_once()
sang include()
, doSomething()
mã cập nhật như sau:
function doSomething() {
include(xyz.php);
....
}
Bây giờ mỗi cuộc gọi lặp để doSomething()
nhận các giá trị không đổi được xác định trong xyz.php
.
Từ hướng dẫn :
require()
là giống hệt nhưinclude()
ngoại trừ khi thất bại, nó cũng sẽ tạo ra mộtE_COMPILE_ERROR
lỗi nghiêm trọng . Nói cách khác, nó sẽ tạm dừng tập lệnh trong khiinclude()
chỉ phát ra cảnh báo (E_WARNING
) cho phép tập lệnh tiếp tục.
Điều này cũng đúng với các _once()
biến thể.
Trong thời đại của trình tải PSR-0 / PSR-4
tự động, có thể hoàn toàn không cần thiết sử dụng bất kỳ câu lệnh nào nếu tất cả những gì bạn cần là làm cho một số hàm / lớp có sẵn cho mã của bạn (tất nhiên, bạn vẫn cần require_once
tự động tải trong tệp và include
mẫu bootstrap của mình nếu bạn vẫn sử dụng PHP làm công cụ mẫu).
Khi nào nên sử dụng require
hay include
?
Các hàm require
và các include
hàm thực hiện cùng một tác vụ, nghĩa là bao gồm và đánh giá tệp đã chỉ định, nhưng sự khác biệt require
sẽ gây ra lỗi nghiêm trọng khi vị trí tệp được chỉ định không hợp lệ hoặc cho bất kỳ lỗi nào trong khi include
sẽ tạo cảnh báo và tiếp tục thực thi mã.
Vì vậy, bạn có thể sử dụng require
chức năng trong trường hợp tệp bạn đang cố gắng đưa vào là trái tim của hệ thống và có thể gây ra tác động lớn đến phần còn lại của mã và bạn có thể sử dụng include
chức năng khi tệp bạn đang cố gắng đưa vào là tập tin đơn giản chứa một số mã ít quan trọng.
Và khuyến nghị cá nhân của tôi (đối với mã ít quan trọng hơn) là sử dụng require
chức năng ở mọi nơi trong mã của bạn trong khi đang trong giai đoạn phát triển để bạn có thể gỡ lỗi mã và sau đó thay thế tất cả các require
chức năng bằng include
chức năng trước khi chuyển nó sang sản xuất để nếu bạn bỏ lỡ bất kỳ lỗi nào nó sẽ không ảnh hưởng đến người dùng cuối và phần còn lại của mã thực thi đúng cách ...
Khi nào nên sử dụng require_once
hay require
?
Sự khác biệt cơ bản giữa require
và require_once
là require_once
sẽ kiểm tra xem các tập tin đã được bao gồm hoặc không nếu nó đã được đưa vào thì sẽ không bao gồm các tập tin trong khi require
chức năng sẽ bao gồm các tập tin cho dù tập tin đã được bao gồm hoặc không.
Vì vậy, trong trường hợp bạn muốn bao gồm một số đoạn mã lặp đi lặp lại, hãy sử dụng require
hàm trong khi nếu bạn muốn bao gồm một số mã chỉ một lần trong mã của mình, hãy sử dụng require_once
.
Sử dụng chức năng yêu cầu khi bạn cần tải bất kỳ lớp, chức năng hoặc phụ thuộc.
Sử dụng chức năng bao gồm khi bạn muốn tải tệp theo kiểu mẫu
Nếu bạn vẫn còn bối rối, chỉ cần sử dụng allow_once cho tất cả các thời gian.
Chúng là tất cả các cách bao gồm các tập tin.
Yêu cầu có nghĩa là nó cần nó. Require_once có nghĩa là nó sẽ cần nó nhưng chỉ yêu cầu một lần. Bao gồm có nghĩa là nó sẽ bao gồm một tệp nhưng nó không cần nó để tiếp tục.
Ví dụ:
Require 'filename'
Require_once 'filename'
Include 'filename'
Ngoài ra còn có một hàm include_once bao gồm một tệp một lần.
Include_once 'filename'
Đừng sử dụng chữ in hoa mà tôi có khi tôi đang gõ từ điện thoại của mình.
một điều tôi nhận thấy, khi sử dụng bao gồm tôi chỉ có thể truy cập các chức năng tệp được bao gồm từ tệp bao gồm nó. Với allow_once, tôi có thể chạy chức năng đó trong tệp required_once thứ hai.
cũng: tôi khuyên bạn nên thêm
if(file_exists($RequiredFile)){
require_once($RequiredFile);
}else{
die('Error: File Does Not Exist');
}
Bởi vì khi request_once giết trang, đôi khi nó có thể lặp lại thư mục của các tệp trang web của bạn
Đây là một chức năng tùy chỉnh tôi đã thực hiện để yêu cầu các tệp:
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;
}
}
ví dụ sử dụng:
$success = addFile('functions/common');
if($success){
commonFunction();
}else{
fallbackFunction();
}
Về cơ bản, nếu bạn yêu cầu một đường dẫn sai, PHP sẽ đưa ra một lỗi nghiêm trọng và hàm tắt máy được gọi, nhưng khi bạn bao gồm một đường dẫn sai, PHP sẽ tiếp tục thực thi, nhưng nó sẽ chỉ hiển thị một cảnh báo rằng tệp không tồn tại.
Từ yêu cầu từ tiếng Anh , PHP được thông báo rằng việc thực thi trang hoặc tệp phụ thuộc vào tệp được yêu cầu.
Theo kinh nghiệm của tôi, nó là chuẩn để yêu cầu các tệp quan trọng như tệp cấu hình, lớp cơ sở dữ liệu và các tiện ích quan trọng khác.
Đây thường là vấn đề bạn có muốn tải thư viện máy khách một cách có điều kiện hay tiếp tục và tải nó cho dù bạn có sử dụng nó hay không.
Đây là ví dụ cụ thể; xây dựng trên những gì pcj nói.
Giả sử bạn có tệp cấu hình lưu trữ tên người dùng và mật khẩu cơ sở dữ liệu của bạn (conf.php):
<?php
//my site configuration file
//For Database
$location='localhost';
$dbuser='yourname';
$userpw='yourpassword';
$database='nameofdatabase';
?>
Và một lớp với hàm tĩnh sử dụng cơ sở dữ liệu:
<?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
}
}
?>
Và hàm tĩnh đó được sử dụng bên trong một hàm khác đang được gọi lặp lại bên trong một vòng lặp:
<?php
require_once('path/to/arbitraryObject.php'); //either will likely be OK at this level
$obj = new arbitraryObject();
foreach($array as $element){
$obj->myFunction();
}
?>
Bạn chỉ có thể yêu cầu / bao gồm các lớp một lần. Nếu bạn yêu cầu / đưa nó vào mỗi lần lặp của vòng lặp, bạn sẽ gặp lỗi. Tuy nhiên, bạn phải bao gồm tệp conf của mình mỗi khi hàm tĩnh được gọi.
<?php
class arbitraryObject {
public function myFunction(){
require_once(/path/to/UsedInLoop.php); //This must be require_once. require() will not work
UsedInLoop::databaseQuery();
}
}
?>
Tất nhiên, di chuyển nó ra ngoài chức năng có thể là một giải pháp cho vấn đề đó:
<?php
require(/path/to/UsedInLoop.php); //now require() is fine
class arbitraryObject {
public function myFunction(){
UsedInLoop::databaseQuery();
}
}
?>
Trừ khi bạn quan tâm đến chi phí tải một lớp chỉ có thể được sử dụng trong một số điều kiện nhất định và không muốn tải nó khi không có.
require
có chi phí lớn hơn include
, vì nó phải phân tích tệp trước. Thay thế requires
bằng includes
thường là một kỹ thuật tối ưu hóa tốt.
require
không phân tích cú pháp tập tin nhiều hơn include
không. Các _once
phiên bản của các chức năng này đều có một chút chi phí hoạt động, nhưng như những người khác đã nói, nó gần như không đáng kể trong hầu hết các ứng dụng.
Chỉ cần sử dụng yêu cầu và bao gồm.
Bởi vì nghĩ làm thế nào để làm việc với include_once hoặc allow_once. Đó là tìm kiếm dữ liệu nhật ký lưu các tệp PHP được yêu cầu. Vì vậy, đó là chậm hơn bao gồm và yêu cầu.
if (!defined(php)) {
include 'php';
define(php, 1);
}
Chỉ cần sử dụng như thế này ...