07/09/2018, 10:48

"INCLUDE", "INCLUDE_ONCE", "REQUIRE" và "REQUIRE_ONCE" khác nhau như thế nào

include, include_once, require và require_once là các hàm khác nhau trong PHP dùng để tải nạp một file PHP bên ngoài vào trong file bên trong chương trình hiện tại. Về mặt cú pháp thì cả bốn hàm này cùng có chung một cú pháp sử dụng như nhau. Chúng ta dùng các hàm này bằng cách đặt tên file cần ...

include, include_once, require và require_once là các hàm khác nhau trong PHP dùng để tải nạp một file PHP bên ngoài vào trong file bên trong chương trình hiện tại. Về mặt cú pháp thì cả bốn hàm này cùng có chung một cú pháp sử dụng như nhau. Chúng ta dùng các hàm này bằng cách đặt tên file cần nạp trong cặp ngoặc kép theo sau bởi tên hàm, tương tự như khi dùng echo:

<?php
include "a.php";
require "b.php";
include_once "c.php"; 
require_once "d.php";

Hoặc bạn cũng có thể để tên file cần nạp vào bên trong cặp dấu ngoặc () giống như khi gọi một hàm PHP thông thường:

<?php
include ("a.php");
require ("a.php");
include_once ("c.php");
require_once ("d.php");

Do có sự tương đồng giữa các hàm này nên chúng thường có thể được sử dụng thay thế cho nhau. Tuy nhiên có rất nhiều sự khác nhau giữa các hàm này và phân biệt được sự khác nhau này sẽ giúp chúng ta trình hiệu quả hơn cũng như tránh gặp phải lỗi không nên xuất hiện trong chương trình. Ngoài ra thì phân biệt khác nhau giữa include, include_once, require và require_once cũng là một trong số các câu hỏi phỏng vấn PHP phổ biến được các nhà tuyển dụng ưa thích.

Trong phần dưới đây đây, chúng ta sẽ đi vào so sánh từng cặp hàm với nhau để xem xét sự giống và khác nhau của các cặp hàm này qua đó giúp bạn xác định được trong trường hợp nào thì sử dụng hàm nào là phù hợp.

Khác Biệt Giữa inclulde và require

Hai hàm include và requiređều được dùng để tải nội dung file bên ngoài vào trong chương trình, tuy nhiên nếu file này không tồn tại hoặc xuất hiện lỗi khi nạp (ví dụ như không có quyền đọc nôi dung của file) thì đối với trường hợp dùng include, PHP sẽ văng ra thông báo lỗi warning, tuy nhiên sau đó thì chương trình vẫn chạy tiếp tục. Ngược lại với trường hợp sử dụng require thì PHP sẽ văng ra thông báo lỗi fatal và đồng thời kết thúc quá trình thực thi chương trình tại thời điểm này.

Ví dụ trong trường hợp bạn dùng include để nạp vào chương trình nội dung của một file PHP không tồn tại như trong đoạn code sau:

<?php
include "file_not_found.php"
echo "Hello";

Thì khi chạy bạn chương trình ở trên bạn sẽ thấy nội dung hiển thị như sau:

Warning: include(): Failed opening 'file_not_found.php' for inclusion (include_path='.:') in /private/tmp/test.php on line 2
Hello

Lưu ý: Nếu hệ thống của bạn được cấu hình để ẩn thông báo lỗi warning thì trong trường hợp này bạn sẽ chỉ thấy dòng chữ Hello mà không thấy thông báo lỗi.

Ngược lại nếu trong trường hợp trên bạn dùng require:

<?php
require "file_not_found.php"
echo "Hello";

Thì khi chạy bạn sẽ chỉ thấy dòng thông báo lỗi mà không có dòng chữ Hello xuất hiện sau đó:

Fatal error: require(): Failed opening required 'file_not_found.php' (include_path='.:') in /private/tmp/test.php on line 2

Khác Biệt Giữa include và include_once

Một chương trình PHP thực tế thường sẽ không bao gồm một vài file mà sẽ có rất nhiều file trong đó. Trong các dự án lớn thì mỗi file thường sẽ có hàng trăm ngàn dòng trở lên và được viết bởi nhiều lập trình viên khác nhau. Giả sử trong source code của dự án có một file helper_functions.php chứa các hàm hỗ trợ mà sẽ được sử dụng phổ biến. Lúc này điều gì sẽ xảy ra nếu trong file app.php ở dòng 1200 một lập trình viên nạp vào file helper_functions.php này rồi và dòng 3500 thì một lập trình viên khác cũng làm một điều tương tự:

<?php
include "helper_functions.php"; // dòng 1200
...
...
...
include "helper_functions.php"; // dòng 3500

Nếu sử dụng include như trên thì PHP sẽ nạp nội dung của file helper_functions.php vào trong app.php hai lần. Điều này không những không hiệu quả mà còn có thể gây ra những lỗi tiềm ẩn ví dụ như nếu trong helper_functions.php có khai báo một class như sau:

<?php
class MyTestClass {
}

Thì việc nạp lại file này lần thứ hai ví dụ như trong đoạn code dưới đây:

<?php
include "helper_functions.php";
include "helper_functions.php";

Thì khi thực thi chương trình sẽ sinh ra ra lỗi fatal với thông báo lỗi như sau:

Fatal error: Cannot redeclare class MyTestClass in /private/tmp/helper_functions.php on line 2

Trường hợp này nếu bạn sử dụng include_once thì PHP sẽ không nạp lại file helper_functions.php nếu như lỗi này được nạp vào trước đó:

<?php
include_once "helper_functions.php";
include_once "helper_functions.php";

Khác Biệt Giữa require và require_once

Sự khác biệt giữa require và require_once tương tự với sự khác biệt giữa include và include_once ở trên với một sự khác biệt đó là khi sử dụng require hoặc require_once và trong trường hợp file được nạp vào không tồn tại hoặc gặp lỗi khi đọc file này thì PHP sẽ văng ra lỗi fatal đồng thời chấm dứt quá trình thực thi chương trình. Ngược lại khi sử dụng include hoặc include_once thì PHP sẽ văng ra lỗi warning và chương trình vẫn tiếp tục chạy.

Khác Biệt Giữa include_once và requice_once

Sự khác biệt giữa include_once và requice_once tương tự với sự khác biệt giữa include và require ở trên với một sự khác biệt đó là khi sử dụng include_once hoặc require_once thì với cùng một file việc gọi lặp lại hai hàm này trong chương trình thì PHP cũng sẽ chỉ nạp nội dung cùa file đó một lần duy nhất. Tuy nhiên với include hoặc require thì file sẽ được nạp vào với số lần tương ứng bằng số lần các hàm này được gọi.

Bài Tập Thực Hành

Tham khảo lý thuyết như vậy đã đủ. Bây giờ tôi sẽ đưa ra một bài tập nhỏ để bạn có thể kiểm tra lại hiểu biết của mình sau khi đã đọc các phân tích ở trên. Hãy tham khảo hai ví dụ dưới đây và suy nghĩ xem kết quả trả về sẽ là gì.

Ví dụ đầu tiên:

<?php
include_once "helper_functions.php";
include "helper_functions.php";

Và ví dụ thứ hai:

<?php
include "helper_functions.php";
include_once "helper_functions.php";

Trong đó file helper_functions.php có nội dung như sau:

<?php
class MyTestClass {
}

Nếu bạn đã có câu trả lời hoặc có gì đó cần thắc mắc về câu hỏi bạn có thể thêm nhận xét ở phía dưới bài viết.

0