Bạn đã bao giờ lái một chiếc xe Toyota Camry với chỉ 1 bánh xe? Chắc chắn là không rồi!
Có một giai đoạn.
Mà lập trình viên PHP nào cũng trải qua.
Bạn bắt đầu chia project thành nhiều file. Nhìn tổng thể đã "ra gì và này nọ" lắm rồi, oai vệ lắm rồi!
Không còn cảnh "quê một cục" khi chỉ một file index.php
dài 5.000 dòng nữa.
Thay vào đó.
Giờ đây, "trình đã lên", bạn tạo:
- config.php
- header.php
- footer.php
- database.php
- menu.php
Rồi trong index.php.
Bạn viết:
include "header.php";
Website chạy.
Hôm sau.
Bạn đổi thành:
require "header.php";
Website vẫn chạy.
Sau đó, bạn lại thấy "đâu đó" trên Internet có:
include_once
và:
require_once
Lúc này.
Cái đầu minh mẫn bắt đầu quay, hơi...nhức nhức cái đầu!
"Ủa... bốn cái này khác nhau chỗ nào?"
"Sao PHP thích làm khó người mới vậy?"
Thật ra.
PHP không làm khó.
Nó chỉ cho bạn...
4 cách "mời" một file khác vào chương trình.
include, require, include_once và require_once là gì?
Đây là bốn câu lệnh trong PHP dùng để nạp (include) nội dung của một file vào file hiện tại.
Khác biệt nằm ở hai điểm:
Nếu file bị thiếu thì chương trình có dừng hay không.
File có được nạp nhiều lần hay chỉ một lần.
Ví dụ...ăn uống
Bạn đang nấu mì.
Muốn có:
- Trứng.
- Rau.
- Xúc xích.
Bạn phải lấy từng nguyên liệu từ tủ lạnh.
Project PHP cũng vậy.
Muốn có:
- Database.
- Header.
- Menu.
- Footer.
- ...
Bạn phải "lấy" từng file vào.
Đó chính là:
include
require
include hoạt động thế nào?
Ví dụ.
include "header.php";
PHP sẽ:
Mở file.
↓
Đọc nội dung.
↓
Chèn vào đúng vị trí đó.
Giống như bạn copy-paste cả file.
Nếu file không tồn tại?
Ví dụ.
include "abc.php";
PHP báo:
Warning.
Nhưng.
Chương trình vẫn chạy tiếp.
Ví dụ.
include "abc.php";
echo "Website vẫn chạy";
↓
Bạn vẫn thấy:
Website vẫn chạy
require thì sao?
require "config.php";
Nếu file tồn tại.
↓
Mọi thứ bình thường.
Nếu file không tồn tại.
↓
Fatal Error.
↓
Website dừng luôn.
Ví dụ thực tế
include giống như:
Bạn định pha cà phê.
Không có đường.
Thôi.
Uống cà phê đắng.
Vẫn được.
require giống như:
Bạn định lái xe.
Không có bánh xe.
Thì...
Không thể đi tiếp.
Khi nào nên dùng require?
Ví dụ.
File: database.php
Nếu thiếu.
Website gần như không thể hoạt động.
↓
Nên dùng:
require "database.php";
Tương tự.
Các file:
- config.php
- autoload.php
- functions.php
thường cũng dùng:
require
Khi nào nên dùng include?
Ví dụ.
sidebar.php
Hoặc.
banner.php
Thiếu cũng không quá nghiêm trọng.
↓
Có thể dùng:
include
Website vẫn hoạt động.
Chỉ thiếu một phần giao diện.
include_once là gì?
Đây là phiên bản "thông minh" hơn.
Ví dụ.
Bạn viết:
include_once "config.php";
Nếu file đã được nạp.
↓
PHP sẽ bỏ qua.
Không nạp lần thứ hai.
require_once cũng vậy
require_once "database.php";
Nếu file đã có.
↓
Không đọc lại.
Nếu chưa có.
↓
Đọc vào.
Nếu không tìm thấy.
↓
Fatal Error.
Vì sao phải có _once?
Đây là lỗi rất hay gặp.
Ví dụ.
File:
functions.php
Có:
function hello()
{
}Bạn:
include "functions.php";
include "functions.php";
PHP báo:
Cannot redeclare function hello()
Vì.
Hàm bị khai báo hai lần.
require_once cứu bạn
Chỉ cần đổi thành:
require_once "functions.php";
↓
Dù gọi nhiều lần.
PHP chỉ nạp:
Một lần.
Xong.
Tập tành làm web
Có bạn gửi project.
Trang chủ.
OK.
Trang sản phẩm.
Fatal Error.
Sau khoảng 5 phút.
Phát hiện.
File:
functions.php
được include ở:
- Header.
- Menu.
- Footer.
- Index.
Kết quả.
Một hàm bị khai báo:
4 lần.
Đổi sang:
require_once
Website chạy ngay.
Một hiểu lầm phổ biến
Nhiều người nghĩ.
Cứ dùng:
include
cho mọi thứ.
Không nên.
Hãy tự hỏi:
"Nếu thiếu file này.
Website có còn chạy được không?"
Nếu:
Không.
↓
Dùng:
require
Nếu:
Có.
↓
Dùng:
include
Nên dùng cái nào nhiều nhất?
Trong project PHP hiện đại.
Thường dùng:
require_once
Vì:
- Quan trọng
- Không bị include trùng
- An toàn
Rất nhiều framework.
Thư viện.
CMS.
Cũng có cách tiếp cận tương tự.
Debug kiểu dev "xịn sò"
1. File cấu hình nên dùng require_once
Ví dụ.
- Database.
- Config.
- Functions.
2. Đừng include cùng một file nhiều lần
Đặc biệt khi file có:
- Function.
- Class.
- Constant.
3. Đọc kỹ thông báo lỗi
Nếu thấy:
Cannot redeclare...
Hãy nghĩ ngay.
Include trùng.
4. Tổ chức project rõ ràng
Đừng để:
config.php
xuất hiện ở 10 nơi khác nhau.
Checklist chuẩn không cần chỉnh
- include: thiếu file vẫn chạy
- require: thiếu file dừng chương trình
- include_once: chỉ nạp một lần
- require_once: vừa bắt buộc vừa chỉ nạp một lần
- File cấu hình nên dùng require_once
- Tránh include trùng file chứa function hoặc class
FAQ nhanh
include và require khác nhau thế nào?
include báo Warning và chương trình vẫn chạy.
require báo Fatal Error và dừng chương trình.
include_once có chậm hơn include không?
Khác biệt rất nhỏ và thường không đáng kể trong đa số project.
Có nên dùng require_once cho mọi project mới?
Với các file cấu hình, thư viện hoặc hàm dùng chung thì đây là lựa chọn rất phổ biến.
Vì sao báo "Cannot redeclare function"?
Thường do cùng một file chứa hàm bị include nhiều lần.
Bạn có thể cũng đang gặp
localhost vs hosting khác nhau thế nào?
Vì sao Windows chạy nhưng Linux host chết?
UTF-8 và bi kịch tiếng Việt bị lỗi font
Call to undefined function là gì?
Cache là gì? (Vì sao sửa code rồi mà website vẫn không thay đổi?)
Comment code đúng cách để khỏi tự giết mình