PHP: include


Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên

Phiên bản: PHP 4, PHP 5, PHP 7.

Câu lệnh include dùng để đưa vào tập tin hiện tại một tập tin cụ thể.

Phần trình bày dưới đây cũng áp dụng cho requre.

Các tập tin được đưa vào dựa trên đường dẫn tập tin đã cho, hoặc nếu không cho đường dẫn tập tin thì tập tin sẽ được xác định thông qua include_path. Nếu tập tin không tìm thấy trong include_path, thì include sẽ kiểm tra trong chính thư mục được chỉ định và thư mục hiện tại trước khi thất bại. Cấu trúc include sẽ đưa ra một cảnh báo nếu nó không thể tìm thấy tập tin; hành vi này khác với require (đưa ra một fatal error).

Nếu đường dẫn được định nghĩa - có thể là tuyệt đối hoặc tương đối tới thứ mục hiện tại (bắt đầu bằng . hoặc ..) - thì include_path sẽ được bỏ qua. Ví dụ, nếu một tập tin bắt đầu với ../, thì bộ parser sẽ tìm tập tin yêu cầu trong thư mục cha.

Khi một tập tin được đưa vào thì nó sẽ thừa kế các biến nằm trên dòng mà tập tin đó được đưa vào. Bất kỳ một biến nào có sẵn trong tập tin gọi thì đều sử dụng được ở tập tin được gọi. Tuy nhiên, tất cả các hàm và lớp định nghĩa trong tập tin được gọi sẽ đều có phạm vi là global.

Ví dụ 1: Cách dùng include cơ bản.

//vars.php
<?php

$color 
'green';
$fruit 'apple';

?>


//test.php
<?php

echo "A $color $fruit"// A

include 'vars.php';

echo 
"A $color $fruit"// A green apple

?>

Nếu việc gọi tập tin xảy ra bên trong một hàm thì tất cả mã lệnh trong tập tin được gọi sẽ cư xử như nó đã được định nghĩa trong hàm đó. Do đó, nó sẽ theo sau phạm vi biến của hàm đó. Một ngoại lệ cho quy tắc này là hằng số ma thuật (magic constant) sẽ được lượng giá bởi bộ parser trước khi đưa vào tập tin.

Ví dụ 2: Đưa tập tin vào hàm.

<?php

function foo()
{
    global 
$color;

    include 
'vars.php';

    echo 
"A $color $fruit";
}


/* vars.php nằm trong hàm foo() *
* nên $fruit không sử dụng được bên ngoài hàm này. *
* $color thì được vì nó được khai báo là global. */


foo();                    // A green apple
echo "A $color $fruit";   // A green

?>

Khi đưa vào tập tin thì việc phân tích sẽ ra khỏi chế độ PHP và vào chế độ HTML tại vị trí bắt đầu của tập tin gốc, và lại tiếp tục lại ở cuối. Lý do của vấn đề này là vì bất kỳ đoạn mã nào bên trong tập tin đích đều phải được thực thi giống như đoạn mã PHP phải được đặt trong thẻ mở và đóng PHP.

Nếu "URL include wrappers" được phép trong PHP thì ta có thể xác định tập tin được đưa vào bằng cách sử dụng URL (thông qua HTTP hoặc bộ wrapper khác) thay cho đường dẫn cục bộ. Nếu server đích thông dịch tập tin đích thành mã PHP thì các biến có thể truyền tới tập tin được đưa vào bằng cách sử dụng một URL để yêu cầu chuỗi sử dụng với HTTP GET. Điều này không hẳn đúng cho những trường hợp tương tự khi đưa vào tập tin và nó thừa kế phạm vi biến của tập tin cha, nhưng kịch bản thực sự lại đang chạy trên remote server và kết quả lại được đưa vào kịch bản cục bộ.

Ví dụ 3: include qua HTTP

<?php

/* Ví dụ này giả sử rằng www.example.com được cấu hình để phân tích các tập tin .php
* mà không phải là các tập tin .txt. Do đó, sự thực thi ở đây có nghĩa rằng các biến
* $foo và $bar sử dụng được trong tập tin được đưa vào. */

// Không làm việc, tập tin .txt không được xử lý bởi www.example.com thành PHP

include 'http://www.example.com/file.txt?foo=1&bar=2';

// Không làm việc, tìm kiếm tập tin có tên 'file.php?foo=1&bar=2' trên máy cục bộ.
include 'file.php?foo=1&bar=2';

// Làm việc.
include 'http://www.example.com/file.php?foo=1&bar=2';

$foo 1;
$bar 2;
include 
'file.txt';  // Works.
include 'file.php';  // Works.

?>

Cảnh báo bảo mật

Tập tin remote có thể được xử lý tại server remote (phụ thuộc vào đuôi mở rộng của tập tin và thực tế server remote chạy PHP hay không) nhưng nó vẫn phải tạo ra một kịch bản PHP hợp lệ vì nó không được xử lý tài server cục bộ. Nếu tập tin từ server remote phải xử lý những điều này và chỉ output, thì hàm readfile() cần được sử dụng. Nếu không thì ta cần đặc biệt quan tâm đến việc đảm bảo kịch bản remote sẽ tạo ra một đoạn mã hợp lệ và có giá trị.

Xử lý giá tri trả về: include trả về FALSE nếu thất bại và đưa ra một cảnh báo. Nếu đưa vào thành công, trừ khi khi đè tập tin đã được đưa vào trước đó, thì nó sẽ trả về 1. Ta có thể thực hiện câu lệnh return trong tập tin đã đưa vào để ngắt xử lý trong tập tin đó và trả về kịch bản trong tập tin đó. Bạn có thể đưa một giá trị vào lời gọi giống như một hàm thông thường. Tuy nhiên, ta không thể đưa vào những tập tin remote trừ khi output của nó có chứa các thẻ PHP bắt đầu và kết thúc hợp lệ. Ta cũng có thể khai báo những biến cần thiết trong những thẻ này và chúng sẽ được sử dụng vào những vị trí tương ứng với tập tin đã được đưa vào.

include cho phép bỏ đi cặp ngoặc tròn bao ngoài đối số của nó, do vậy bạn hãy cẩn thận khi so sánh giá trị trả về của nó.

Ví dụ 4: So sanh giá trị trả về của include

<?php
// sẽ không làm việc, do bạn viết include(('vars.php') == TRUE)
if (include('vars.php') == TRUE) {
    echo 
'OK';
}


// làm việc
if ((include 'vars.php') == TRUE) {
    echo 
'OK';
}

?>

Ví dụ 5: include và câu lệnh return.

//return.php
<?php

$var 
'PHP';

return 
$var;

?>


//noreturn.php
<?php

$var 
'PHP';

?>


//testreturns.php
<?php

$foo 
= include 'return.php';

echo 
$foo// in ra 'PHP'

$bar = include 'noreturn.php';

echo 
$bar// in ra 1

?>

$bar chứa gá trị 1 vì đưa vào thành công. Bạn hãy lưu ý về sự khác nhau giữa các ví dụ trong đoạn mã trên. Đâu tiên việc sử dụng return trong tập tin đã đưa vào trong khi tập tin khác lại không hoạt động. Nếu tập tin không thể được đưa vào thì sẽ trả về FALSE đưa ra cảnh báo E_WARNING.

Nếu có các hàm được định nghĩa trong tập tin đưa vào thì chúng có thể được sử dụng trong tập tin chính mà không phụ thuộc vào việc chúng nằm trước hay sau. Nếu tập tin được đưa vào hai lần thi PHP 5 sẽ đưa ra lỗi fatal dó các hàm đã được định nghĩa rồi lại định nghĩa lại, còn PHP 4 vẫn chấp nhận những hàm được định nghĩa sau câu lệnh return. Lưu ý rằng nên sử dụng include_once để kiểm tra nếu như tập tin đã được đưa vào trước đó và trả về điều kiện trong tập tin đưa vào.

Một cách khác để đưa một tập tin PHP vào một biến là bắt phần output bằng cách sử dụng Các hàm điều khiển output với include. Ví dụ 6 dưới đây mô tả điều này.

Ví dụ 6: Sử dụng bộ đệm output để đưa tâp tin PHP vào một chuỗi.

<?php
$string 
get_include_contents('somefile.php');

function 
get_include_contents($filename) {
    if (
is_file($filename)) {
        
ob_start();
        include 
$filename;
        return 
ob_get_clean();
    }
    return 
false;
}


?>

Để tự động đưa các tập tin vào trong các kịch bản thì ta có thể xem các tùy chọn cấu hình  auto_prepend_file và auto_append_file trong tập tin php.ini.

Lưu ý: Do là một cấu trúc ngôn ngữ mà không phải là một hàm, cho nên include không thể được gọi bằng cách sử dụng các biến hàm.

Xem thêm:

» Tiếp: include_once
« Trước: return
Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!