Sự khác biệt giữa những người khác bao gồm những người khác


174

Có sự khác biệt nào giữa chúng không? Là sử dụng chúng là một vấn đề ưu tiên? Việc sử dụng cái này có tạo ra lợi thế nào không? Cái nào tốt hơn cho an ninh?



3
Luôn luôn sử dụng "yêu cầu". "Bao gồm" tiện lợi như cửa điện trong phòng tắm hơi.
Marco Mariani

2
@MarcoMariani Làm thế nào mà bất tiện? Có lẽ rõ ràng, tôi chỉ không nhìn thấy nó. Có lẽ là hơi nước?
Austin Burk

Nói một cách đơn giản, nếu một tập tin 'foo.php' bị thiếu, tôi muốn biết càng sớm càng tốt, không phải khi nào một chức năng lẽ ra phải có trong foo.php được gọi. Thay thế bao gồm với yêu cầu thường có thể tiết lộ lỗi. Giả sử config.php bị thiếu và ứng dụng đang chạy với cấu hình mặc định. Cái nào tốt hơn cho an ninh? Đối với phòng tắm hơi, khi tôi vào trong và cửa không mở vì một số lý do tôi không thích nó.
Marco Mariani

Câu trả lời:


148

Bạn tìm thấy sự khác biệt được giải thích trong hướng dẫn chi tiết về PHP trên trangrequire :

requirelà giống hệt như includengoại trừ khi thất bại, nó cũng sẽ tạo ra một E_COMPILE_ERRORlỗi nghiêm trọng . Nói cách khác, nó sẽ tạm dừng tập lệnh trong khi chỉ bao gồm phát ra cảnh báo ( E_WARNING) cho phép tập lệnh tiếp tục.

Xem câu trả lời của @ efritz để biết ví dụ


6
tiposaurus.co.uk/2011/04/04/ trên "Sự khác biệt chính giữa Yêu cầu () và bao gồm () là nếu bạn yêu cầu () một tệp không thể tải (ví dụ: nếu không có) nó tạo ra một lỗi nghiêm trọng sẽ dừng hoàn toàn việc thực thi trang và sẽ không tạo ra thêm đầu ra nữa. Mặt khác, nếu bạn bao gồm () một tệp không thể tải, thì điều này sẽ chỉ tạo ra cảnh báo và tiếp tục xây dựng trang. "
bão

3
"Cái nào bạn nên sử dụng tùy thuộc vào tình huống; yêu cầu () phù hợp nhất để tải các tệp cần thiết cho phần còn lại của trang - ví dụ: nếu bạn có trang web điều khiển cơ sở dữ liệu thì sử dụng request () để bao gồm tệp chứa Đăng nhập cơ sở dữ liệu và mật khẩu rõ ràng được ưu tiên hơn sử dụng bao gồm (). Nếu bạn đã sử dụng bao gồm () trong tình huống này, thì cuối cùng bạn có thể tạo ra nhiều cảnh báo và lỗi hơn bạn dự định. "
bão

3
<?php if (isset($flibbertygibbet)) require 'file.php';dường như làm cho câu trả lời này trông hoàn toàn không chính xác. Nếu không, tôi sẽ nhận được một lỗi nghiêm trọng mặc dù điều kiện không đúng. stracekhông hiển thị PHP thậm chí đang cố gắng chạm vào file.php.
cHao

Không giống như bao gồm (), request () sẽ luôn đọc trong tệp đích, ngay cả khi dòng nó không bao giờ thực thi. Nếu bạn muốn bao gồm một cách có điều kiện một tệp, hãy sử dụng tệp bao gồm (). VÀ Tuy nhiên, nếu dòng trên đó xảy ra yêu cầu () không được thực thi, thì bất kỳ mã nào trong tệp đích sẽ không được thực thi. Có vẻ như đang nói điều ngược lại, hoặc tôi đang hiểu lầm?
không có

1
Tất cả các ý kiến ​​này đều đề cập đến phiên bản gốc của câu trả lời này trước khi nó được chỉnh sửa. Ban đầu có một khiếu nại không hợp lệ, tuyên bố rằng if (false) require 'file.php';sẽ khiến 'file.php' được tải (nhưng không được thực thi). TLDR bỏ qua tất cả các ý kiến.
Kevin Wheeler


5

Sử dụng includenếu bạn không nhớ tập lệnh của mình tiếp tục mà không tải tệp (trong trường hợp nó không tồn tại, v.v.) và bạn có thể (mặc dù bạn không nên) sống với thông báo lỗi Cảnh báo được hiển thị.

Sử dụng requirecó nghĩa là tập lệnh của bạn sẽ dừng nếu nó không thể tải tệp được chỉ định và gây ra lỗi nghiêm trọng.


2

Như những người khác đã chỉ ra, sự khác biệt duy nhất là yêu cầu ném một lỗi nghiêm trọng và bao gồm - một cảnh báo có thể bắt được. Đối với một trong những để sử dụng, lời khuyên của tôi là dính vào. Tại sao? bởi vì bạn có thể bắt được cảnh báo và đưa ra phản hồi có ý nghĩa cho người dùng cuối. Xem xét

  // 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: ví dụ 2 để hoạt động, bạn cần cài đặt trình xử lý lỗi ngoại lệ, như được mô tả ở đây 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");   

Ở cấp độ bao gồm không phải là một nơi tuyệt vời để tìm hiểu rằng tệp bạn mong đợi không có ở đó. Không có vấn đề nào trong ví dụ của bạn là vấn đề khiến người xem trang web của bạn thất vọng.
Kzqai

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

Một ví dụ thực tế rất đơn giản với mã. Tiếng vang đầu tiên sẽ được hiển thị. Không có vấn đề bạn sử dụng bao gồm hoặc yêu cầu bởi vì nó chạy trước bao gồm hoặc yêu cầu.

Để kiểm tra kết quả, Trong dòng thứ hai của mã cố tình cung cấp đường dẫn sai đến tệp hoặc mắc lỗi trong tên tệp. Do đó, tiếng vang thứ hai được hiển thị hay không sẽ hoàn toàn phụ thuộc vào việc bạn sử dụng yêu cầu hay bao gồm .

Nếu bạn sử dụng yêu cầu tiếng vang thứ hai sẽ không thực hiện nhưng nếu bạn sử dụng bao gồm không có vấn đề gì xảy ra, bạn cũng sẽ thấy kết quả của tiếng vang thứ hai.


-2

Trong trường hợp Chương trình Bao gồm sẽ không chấm dứt và hiển thị cảnh báo trên trình duyệt, mặt khác, chương trình Yêu cầu sẽ chấm dứt và hiển thị lỗi nghiêm trọng trong trường hợp không tìm thấy tệp.


Bạn có thực sự phải trả lời một câu hỏi 2 năm rưỡi để lặp lại 2/3 câu trả lời đã nói gì không ...?
cHao

4
À, anh ấy là người mới! Có lẽ vẫn chưa hiểu khái niệm về SO.
Dan Hanly

Người dùng nghèo 2069222, giờ anh ta rời SO: '(
Gagantous
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.