include 'header.php'; menjalankan kode dari file PHP lain di titik itu dalam script, seolah-olah kodenya ditempel di sana. require 'header.php'; melakukan hal yang sama, tetapi jika file-nya tidak bisa dimuat, require menghentikan script dengan fatal error sedangkan include hanya mencetak warning lalu lanjut. Pemakaian pertama yang paling umum adalah header dan footer yang dipakai bersama oleh setiap halaman.
Blok ini menulis header.php dan footer.php lebih dulu, agar ada file yang bisa di-include. Jalankan dan lihat tab Halaman:
File yang di-include adalah file PHP biasa: isinya bisa berupa HTML dengan tag <?= ?>, dan file itu melihat variabel $title yang diisi sebelum require. Ubah judulnya lalu jalankan lagi; setiap halaman yang me-require header akan ikut mendapat perubahan pada satu file itu.
include vs require
Satu-satunya perbedaan adalah apa yang terjadi saat file-nya tidak ada atau tidak bisa dibaca. include mencetak dua warning, bernilai false, dan script lanjut:
Warning: include(sidebar.php): Failed to open stream: No such file or directory in /home/index.php on line 2
Warning: include(): Failed opening 'sidebar.php' for inclusion (include_path='.:/usr/share/php83') in /home/index.php on line 2
require mencetak warning yang sama lalu melempar Error, yang mengakhiri script kecuali ada yang menangkapnya:
PHP Warning: require(config.php): Failed to open stream: No such file or directory in /home/index.php on line 2
PHP Fatal error: Uncaught Error: Failed opening required 'config.php' (include_path='.:/usr/share/php83') in /home/index.php:2
Jadi pakai require untuk apa pun yang dibutuhkan halaman agar bisa berjalan (konfigurasi, library fungsi, file class) dan include untuk bagian yang opsional. Untuk bagian yang memang boleh tidak ada, periksa dulu keberadaannya alih-alih mengandalkan warning:
Output:
Spring sale: 20% off
banner.php included, include returned int(1)
sidebar.php not found, skipped
include_once dan require_once
File yang mendefinisikan fungsi atau class hanya bisa dimuat sekali: memuatnya untuk kedua kali adalah fatal error, karena fungsinya sudah ada.
Fatal error: Cannot redeclare greet() (previously declared in /home/helpers.php:2) in /home/helpers.php on line 2
Hal itu terjadi begitu dua file masing-masing menulis require 'helpers.php'. require_once dan include_once mengingat file mana yang sudah dimuat dan melewatinya pada kali kedua, sambil mengembalikan true:
Output:
int(1)
bool(true)
bool(true)
Hello, Ada
Pakai bentuk _once untuk file yang mendeklarasikan sesuatu, dan include biasa untuk template yang ingin kamu tampilkan lebih dari sekali. Di proyek yang memakai Composer, autoloader memuat file class untukmu, jadi pemanggilan require_once untuk class sebagian besar hilang; lihat Composer.
Mengembalikan nilai dari file yang di-include
return di level teratas file yang di-include menghentikan file itu dan menyerahkan sebuah nilai ke ekspresi include atau require. Cara ini menghasilkan file konfigurasi yang rapi: tanpa variabel global, hanya sebuah nilai yang bisa kamu simpan dengan nama apa pun.
Output:
My Shop
shop
bool(false)
File konfigurasi Laravel (config/app.php, config/database.php, dan lainnya) bekerja dengan cara ini.
Variabel dan scope di file yang di-include
Kode yang di-include berjalan di scope baris yang meng-include-nya. Di bagian atas script, kode itu melihat setiap variabel global; di dalam fungsi, ia hanya melihat variabel lokal fungsi itu. Aturan kedua inilah yang membuat renderer template kecil bisa bekerja: sebuah fungsi yang variabel lokalnya persis variabel-variabel yang boleh dilihat template.
Tab Halaman menampilkan kedua list, yang dirender dari satu file template. Karena include berjalan di dalam render(), template itu melihat $heading dan $products tetapi tidak melihat $secret. Bentuk foreach ... endforeach yang dipakai di template adalah sintaks alternatif yang disediakan PHP untuk template HTML.
Path include dan DIR
Path seperti 'helper.php' tidak diselesaikan relatif terhadap file yang berisi include. PHP mencari di pengaturan include_path (yang biasanya diawali ., direktori kerja saat ini) dan baru setelah itu di folder milik file yang meng-include. Jadi di dalam partials/nav.php, include 'helper.php' bisa memuat helper.php yang sama sekali berbeda dari root proyek. __DIR__, direktori dari file saat ini, menghilangkan tebak-tebakan itu:
Output:
loaded the root helper.php
loaded partials/helper.php
__DIR__ in nav.php is partials
Tulis setiap include sebagai __DIR__ . '/relative/path.php'. Direktori kerja bergantung pada cara script dijalankan (web server, cron job, command line dari folder lain), tetapi __DIR__ tidak pernah berubah.
Jangan pernah meng-include file yang dinamai oleh pengguna
Router pertama yang umum dibuat membaca nama halaman dari URL: include $_GET['page'] . '.php';. Cara itu membiarkan pengunjung memilih file mana di server yang dijalankan, misalnya ?page=../../config (local file inclusion), dan dengan pengaturan lama bahkan file dari server lain. Sebagai gantinya, petakan nama yang diizinkan ke file. Jalankan blok ini lalu klik link-linknya: setiap klik menjalankan script lagi dengan $_GET['page'] yang berbeda.
Hanya tiga nama di $pages yang bisa sampai ke require; link ../secret mendapat halaman "Not found". Cara membaca nilai request dengan aman dibahas di _POST.
Pertanyaan yang sering diajukan
Apa perbedaan include dan require di PHP?
Keduanya memuat dan menjalankan file PHP lain. Jika file-nya tidak bisa dimuat, require menghentikan script dengan fatal error, sedangkan include mencetak warning, mengembalikan false, dan membiarkan script lanjut. Pakai require untuk file yang dibutuhkan halaman agar bisa berjalan, seperti konfigurasi dan library fungsi.
Kapan sebaiknya memakai require_once alih-alih require?
Pakai require_once untuk file yang mendefinisikan fungsi, class, atau konstanta. Memuat file seperti itu dua kali adalah fatal error (Cannot redeclare), dan require_once melewati file yang sudah pernah dimuat. Template yang ingin kamu cetak beberapa kali memakai include biasa.
Bisakah file PHP yang di-include mengembalikan nilai?
Bisa. return di level teratas file yang di-include mengakhiri file itu dan menjadi nilai dari ekspresi include atau require: $config = require 'config.php'; dengan return ['debug' => true]; di config.php. Tanpa return, include bernilai 1.
Apakah file yang di-include bisa mengakses variabel saya?
Bisa. Kode yang di-include berjalan di scope baris yang meng-include-nya: di bagian atas script ia melihat variabel global, dan di dalam fungsi ia melihat variabel lokal fungsi itu dan tidak ada yang lain. Variabel yang dibuatnya masuk ke scope yang sama.
Sebaiknya saya menulis include('file.php') atau include 'file.php'?
Keduanya berfungsi, karena include dan require adalah konstruksi bahasa, bukan fungsi; tanda kurungnya hanya membungkus path. Sebagian besar panduan gaya menulis require 'file.php'; tanpa tanda kurung.