Ngôn ngữ PHP - Hàm Include và Require

Trong PHP, để có thể chèn nội dung của một file khác(thông thường là file php) vào file PHP hiện tại, chúng ta dùng hàm require() và hàm include(). Việc này nhằm tiết kiệm thời gian và tính nhất quán, giúp cho việc code ứng dụng nhanh hơn.

Gọi file với include, require

Câu lệnh include (hoặc require) dùng để lấy tất cả nội dung bao gồm text, code, và các thẻ của một file(nếu tồn tại ) vào file người dùng sử dụng hàm include.
Gọi file nó rất hữu ích trong việc chúng ta cần gọi cùng một nội dung Php của nhiều file khác nhau của website.

Với hai câu lệnh này về chức năng hoàn toàn tương đồng nhau. Nhưng nó chỉ khác khi thông báo lỗi.

  • Require sẽ sinh ra lỗi và dừng chạy chương trình
  • Include sẽ sinh ra cảnh báo và vẫn chạy chương trình

Trong thực tế người ta vẫn hay sử dụng require hơn để đảm bảo tính thông suốt của hệ thống. Khi có lỗi liên quan đến gọi file thì sẽ dừng chương trình và mình cần phải xử lý ngay.

Ví dụ ta có file1.php với đoạn code sau:

<?php
function sum($numb1,$numb2)
{
    return "Tổng 2 số là: ".$numb1 + $numb2;
}
?>

Cách sử dụng hàm include()
Cú pháp
Include “filename”;

<?php include "file1.php"; ?>
<!DOCTYPE html>
<html>
<head>
<title>Demo - Require và Include</title>
</head>
<body>
<?php
    //Sử dụng hàm TinhTong đã được khai báo trong include.php
    echo "Tổng 2 số 10 và 63 là: ".sum(10,63);
?>
</body>
</html>

Xem ví dụ

Cách sử dụng hàm require()
Cú pháp
Require "filename";

<?php require "file1.php"; ?>
<!DOCTYPE html>
<html>
<head>
<title>Demo - Require và Include</title>
</head>
<body>
 <?php
    //Sử dụng hàm TinhTong đã được khai báo trong include.php
    echo "Tổng 2 số 10 và 63 là: ".sum(10,63);
?>
 </body>
</html>

Xem ví dụ

Lưu ý : bạn có thể gọi hàm include hoặc require bất cứ ở đâu trong trang web.

Phân biệt giữa hàm include() và hàm require()
Khi có lỗi xảy ra(file được chèn không tồn tại):
- Hàm include() sẽ hiển thị ra một thông báo lỗi dạng warning và đoạn mã vẫn tiếp tục được thực thi.
- Hàm require() sẽ hiển thị ra một thông báo lỗi dạng fatal và đoạn mã sẽ bị dừng xử lý ngay sau đó.

<?php include "nofile.php"; ?>
<!DOCTYPE html>
<html>
<head>
<title>Demo - Require và Include</title>
</head>
 <body>
 <?php
    //Sử dụng hàm TinhTong đã được khai báo trong include.php
    echo "Tổng 2 số 10 và 63 là: ".TinhTong(10,63);
?>
</body>
</html>

Ngoài 2 thông báo dạng warning ở đầu rằng không tìm thấy file ‘nofile.php’ , còn có một lỗi fatal không tìm thấy hàm TinhTong() do đoạn mã vẫn tiếp tục thực thi.

<?php require "include1.php"; ?>
<!DOCTYPE html>
<html>
<head>
<title>Demo - Require và Include</title>
</head>
 <body>
 <?php
    //Sử dụng hàm TinhTong đã được khai báo trong include.php
    echo "Tổng 2 số 10 và 63 là: ".TinhTong(10,63);
?>
 </body>
</html>

Có 2 thông báo dạng warning và fatal đều là không tìm thấy file ‘include1.php’ tại dòng 1. Ngoài ra không còn thông báo lỗi nào nữa do đoạn mã đã dừng ngay tại nơi thông báo lỗi fatal ở dòng 1.

Gọi file với include_once và require_once
Ngoài ra còn 2 hàm require_once ‘filename’ và hàm include_once ‘filename’ có chức năng tương tự như như hai hàm require ‘filename’ và hàm include ‘filename’. Song chúng sẽ chỉ chèn file một lần duy nhất, cho dù có khai báo chèn thêm file đó bao nhiêu lần đi nữa.
Ví dụ 
Ta có file fileA.php

<?php
echo "File A</br>";
?>
<?php
  require'fileA.php';
  require_once'fileA.php'; //gọi filea 2 lần,
?>

Xem ví dụ

Hoặc

<?php
  require_once 'fileA.php';
  require_once 'fileA.php';
?>

Xem ví dụ

Kết quả: ta có hoàn toàn như nhau file A
Khi nào nên sử sụng require ?
Bạn nên sử dụng require khi ứng dụng yêu cần phải nhập vào một tập tin mang tính chất bắt buộc. Nếu tập tin này không tồn tại PHP sẽ chấm dứt hoạt động của chương trình đang chạy và hiển thị lỗi E_COMPILE_ERROR.
Ví dụ sau sẽ nhập vào tập tin database_config.php, file này chứa thông tin như database username, password hay địa chỉ host để kết nối tới database:

<?php
require('database_config.php');
?>

Nếu file database_config.php không tồn tại PHP sẽ hiển thị lỗi và chấm dứt chương trình.
Khi nào nên sử dụng require_once ?
Bạn sử dụng require_once khi file nhập vào là bắt buộc phải có và tập tin này chỉ nên được nhập vào một lần đầu tiên, nếu file này tiếp tục được nhập vào sau đó (sử dụng một trong ba hàm require, include hay require_once PHP sẽ bỏ qua việc nhập vào.
Ví dụ sau sẽ nhập vào tậ tin connect_db.php chứa logic thực hiện việc kết nối tới database. Do đó trên mỗi trang có kết nối tới database, chúng ta chỉ nên thực hiện việc nhập vào file này một lần đầu duy nhất.

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

Khi nào nên sử dụng include ?
Sử dụng include khi bạn muốn nhập vào tập tin không mang tính chất bắt buộc, có cũng được không có cũng không sao:

Demo trang web tin tức

Giả sử, bạn cần xây dựng một trang web có 2 trang: trang chủ - nội dung tin tức, có layout như sau:

Các thành phần giống nhau giữa 2 trang là phần header, left , right, footer- chỉ có phần content là khác nội dung. Bạn sẽ cần tạo 2 file: index.php (hiển thị trang chủ), trang_tin_tuc.php (hiển thị nội dung trang tin tức). Như vậy, ở file index.php và trang_tin_tuc.php các phần code giống nhau để xử lý cho việc hiển thị header, left, right , footer- điều này dẫn đến vấn đề dư thừa mã nguồn. Thêm vào đó, nếu một lúc nào đó cần thiết để sửa code cho các chức năng này bạn lại phải cập nhật cho từng file khiến cho vấn đề bảo trì mã nguồn trở nên khó khăn, tính cấu trúc của trang web thiếu logic. 

Để giải quyết vấn đề này, chúng ta tạo thêm 2 file: header.php và left.php, right.php, footer.php cho chức năng hiển thị phần header của trang web và hiển thị phần panel bên trái, right cho phần bên phải, ở file nào cần dùng tới chúng ta chỉ cần triệu gọi hay còn gọi là tải nạp (load) chúng vào vị trí cần dùng là được. Tương tự, bạn cũng có thể tạo một nhóm các file thành các thư viện riêng rẽ - khai báo các hàm mà chúng được sử dụng nhiều lần, mỗi khi cần gọi hàm thì triệu gọi - tải nạp file thư viện mà thôi, không cần phải định nghĩa lại. 


Phần code HMTL trang template

	<!DOCTYPE html>

<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>3 Column Layout</title>
	<style type="text/css">

		/* Layout */
		body {
			min-width: 630px;
		}

		#container {
			padding-left: 200px;
			padding-right: 190px;
		}
		
		#container .column {
			position: relative;
			float: left;
		}
		
		#center {
			padding: 10px 20px;
			width: 100%;
		}
		
		#left {
			width: 180px;
			padding: 0 10px;
			right: 240px;
			margin-left: -100%;
		}
		
		#right {
			width: 130px;
			padding: 0 10px;
			margin-right: -100%;
		}
		
		#footer {
			clear: both;
		}
		
		/* IE hack */
		* html #left {
			left: 150px;
		}

		/* Make the columns the same height as each other */
		#container {
			overflow: hidden;
		}

		#container .column {
			padding-bottom: 1001em;
			margin-bottom: -1000em;
		}

		/* Fix for the footer */
		* html body {
			overflow: hidden;
		}
		
		* html #footer-wrapper {
			float: left;
			position: relative;
			width: 100%;
			padding-bottom: 10010px;
			margin-bottom: -10000px;
			background: #fff;
		}

		/* Aesthetics */
		body {
			margin: 0;
			padding: 0;
			font-family:Sans-serif;
			line-height: 1.5em;
		}
		
		p {
			color: #555;
		}

		nav ul {
			list-style-type: none;
			margin: 0;
			padding: 0;
		}
		
		nav ul a {
			color: darkgreen;
			text-decoration: none;
		}

		#header, #footer {
			font-size: large;
			padding: 0.3em;
			background: #BCCE98;
		}

		#left {
			background: #DAE9BC;
		}
		
		#right {
			background: #F7FDEB;
		}

		#center {
			background: #fff;
		}

		#container .column {
			padding-top: 1em;
		}
		
	</style>
	
	
</head>

<body>

	<header id="header"><?php include "header.php"; ?></header>

	<div id="container">

		<main id="center" class="column">
			<article>
			
				<h1>Heading</h1>
				<p>Trăm năm trong cõi người ta<br>
Nếu không thi lại đâu là sinh viên<br/>
Học đi học lại liên miên<br/>
Chắc là em lại có duyên với thầy<br/>
Mình mà bỏ học như Tây<br/>
Chỉ còn cái nước đi xây phụ hồ<br/>
Chứ còn toan tính đề lô<br/>
Chỉ nuôi mấy quán cầm đồ mà thôi<br/>
Phao đâu cứu nổi thân tôi<br/>
Đắng cay vẫn nở trên môi nụ cười<br/>
Sinh viên cũng chỉ là người<br/>
Có qua có lại có mười có không<br/>
Đời đâu chỉ có màu hồng<br/>
Mì tôm cơm nguội ngày đông ấm lòng<br/>
Đề rối như mớ bòng bong<br/>
Rặn ra chữ viết vài dòng khi thi<br/>
Dẫu rằng thầy có từ bi<br/>
Thì em vẫn phải lượt đi lượt về<br/>
Thôi thì F ghét A,B<br/>
Thi lại chắc cũng là nghề sinh viên.<br/>
<br>
Nguồn : Lượm trên Internet
</p>
			
			</article>								
		</main>

		<nav id="left" class="column">
			<?php include "left.php"; ?>

		</nav>

		<div id="right" class="column">
			<?php include "right.php"; ?>
		</div>

	</div>

	<div id="footer-wrapper">
		<?php include "footer.php"; ?>
	</div>

</body>

</html>

Xem ví dụ

  1. Tạo phần header.php
    <p>Header... </p>
  2. Tạo phần left.php
    <h3>Left heading</h3>
    <ul>
        <li><a href="#">Link 1</a></li>
        <li><a href="#">Link 2</a></li>
        <li><a href="#">Link 3</a></li>
        <li><a href="#">Link 4</a></li>
        <li><a href="#">Link 5</a></li>
    </ul>
    <h3>Left heading</h3>
    <ul>
        <li><a href="#">Link 1</a></li>
        <li><a href="#">Link 2</a></li>
        <li><a href="#">Link 3</a></li>
        <li><a href="#">Link 4</a></li>
        <li><a href="#">Link 5</a></li>
    </ul>

     

  3. Tao phần right.php
    <h3>Right heading</h3>
    <p>Dành cho quảng cáo</p>
    <p>Dành cho quảng cáo</p>
    <p>Dành cho quảng cáo</p>
    <p>Dành cho quảng cáo</p>
    <p>Dành cho quảng cáo</p>
  4. Tạo phần footer.php
    <footer id="footer"><p>Footer... [email protected]</p></footer>

 Cuối cùng toàn bộ trang web demo:

 <!DOCTYPE html>
<!-- Template by html.am -->
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>3 Column Layout</title>
	<style type="text/css">

		/* Layout */
		body {
			min-width: 630px;
		}

		#container {
			padding-left: 200px;
			padding-right: 190px;
		}
		
		#container .column {
			position: relative;
			float: left;
		}
		
		#center {
			padding: 10px 20px;
			width: 100%;
		}
		
		#left {
			width: 180px;
			padding: 0 10px;
			right: 240px;
			margin-left: -100%;
		}
		
		#right {
			width: 130px;
			padding: 0 10px;
			margin-right: -100%;
		}
		
		#footer {
			clear: both;
		}
		
		/* IE hack */
		* html #left {
			left: 150px;
		}

		/* Make the columns the same height as each other */
		#container {
			overflow: hidden;
		}

		#container .column {
			padding-bottom: 1001em;
			margin-bottom: -1000em;
		}

		/* Fix for the footer */
		* html body {
			overflow: hidden;
		}
		
		* html #footer-wrapper {
			float: left;
			position: relative;
			width: 100%;
			padding-bottom: 10010px;
			margin-bottom: -10000px;
			background: #fff;
		}

		/* Aesthetics */
		body {
			margin: 0;
			padding: 0;
			font-family:Sans-serif;
			line-height: 1.5em;
		}
		
		p {
			color: #555;
		}

		nav ul {
			list-style-type: none;
			margin: 0;
			padding: 0;
		}
		
		nav ul a {
			color: darkgreen;
			text-decoration: none;
		}

		#header, #footer {
			font-size: large;
			padding: 0.3em;
			background: #BCCE98;
		}

		#left {
			background: #DAE9BC;
		}
		
		#right {
			background: #F7FDEB;
		}

		#center {
			background: #fff;
		}

		#container .column {
			padding-top: 1em;
		}
		
	</style>
	
	
</head>

<body>

	<header id="header"><?php include "header.php"; ?></header>

	<div id="container">

		<main id="center" class="column">
			<article>
			
				<h1>Heading</h1>
				<p>Trăm năm trong cõi người ta<br>
Nếu không thi lại đâu là sinh viên<br/>
Học đi học lại liên miên<br/>
Chắc là em lại có duyên với thầy<br/>
Mình mà bỏ học như Tây<br/>
Chỉ còn cái nước đi xây phụ hồ<br/>
Chứ còn toan tính đề lô<br/>
Chỉ nuôi mấy quán cầm đồ mà thôi<br/>
Phao đâu cứu nổi thân tôi<br/>
Đắng cay vẫn nở trên môi nụ cười<br/>
Sinh viên cũng chỉ là người<br/>
Có qua có lại có mười có không<br/>
Đời đâu chỉ có màu hồng<br/>
Mì tôm cơm nguội ngày đông ấm lòng<br/>
Đề rối như mớ bòng bong<br/>
Rặn ra chữ viết vài dòng khi thi<br/>
Dẫu rằng thầy có từ bi<br/>
Thì em vẫn phải lượt đi lượt về<br/>
Thôi thì F ghét A,B<br/>
Thi lại chắc cũng là nghề sinh viên.<br/>
<br>
Nguồn : Lượm trên Internet
</p>
			
			</article>								
		</main>

		<nav id="left" class="column">
			<?php include "left.php"; ?>

		</nav>

		<div id="right" class="column">
			<?php include "right.php"; ?>
		</div>

	</div>

	<div id="footer-wrapper">
		<?php include "footer.php"; ?>
	</div>

</body>

</html>

Xem ví dụ