
הצהרת include והצהרת require ב-PHP
הצהרות include ו-require הן כלים בסיסיים ב-PHP המאפשרים שימוש חוזר בקוד, על ידי הכללת קבצים חיצוניים לתוך סקריפטים. גישה זו משפרת את ארגון הקוד, מקדמת שימוש חוזר בקוד (code reuse) ומפשטת את התחזוקה.
הצהרת include מייבאת את התוכן של קובץ PHP אחד לאחר. אם לא ניתן למצוא את הקובץ, PHP זורקת אזהרה (warning) וממשיכה בביצוע הסקריפט.
דוגמה:
<?php
include 'header.php';
?>
בדוגמה זו, אנו טוענים קובץ PHP חיצוני לתוך הקובץ הנוכחי. אם הקובץ אינו נמצא, תצא אזהרה, אבל הסקריפט לא יעצר.
הצהרת require פועלת באופן דומה ל-include, אך אם לא ניתן למצוא את הקובץ, PHP זורקת שגיאה (fatal error) ומפסיקה את ביצוע הסקריפט.
דוגמה:
<?php
require 'header.php';
?>
בדוגמה זו, ובדומה לדוגמה הקודמת, אנו טוענים קובץ PHP חיצוני לתוך הקובץ הנוכחי. עם זאת, אם הקובץ אינו נמצא, ריצת הסקריפט תעצר עם הודעת שגיאה.
הצהרת require נועדה לטעינת קבצים חיוניים, כגון קבצי תצורה או הגדרות חיבור למסדי נתונים, כאשר היעדר הקובץ אמור לעצור את היישום.
הצהרת include נועדה לטעינת קבצים אופציונליים, כמו תבניות או ווידג'טים. במקרים אלו, הסקריפט יכול להמשיך בריצה גם אם הקובץ הנטען חסר.
הצהרת include_once והצהרת require_once
בכל פעם שמופיעה הצהרת include או הצהרת require בסקריפט, מבוצעת טעינת קבצים חיצוניים. גם אם אותם הקבצים כבר נטענו קודם לכן, תבוצע טעינה שלהם פעם נוספת.
הצהרות include_once ו-require_once באות לפתור את הבעיה הזו. באמצעותן, טעינת הקבצים תבוצע פעם אחת בלבד במהלך הסקריפט. כלומר, אם הקובץ כבר נטען, הוא לא יטען פעם נוספת.
דוגמה:
<?php
require_once 'config.php';
$conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
include_once 'header.php';
echo "<h1>Welcome to My Website</h1>";
?>
בדוגמה זו, הקובץ config יטען פעם אחת בלבד. אם הוא אינו קיים, תצא שגיאה והסקריפט יעצר. בהמשך הסקריפט, הקובץ header יטען פעם אחת בלבד. אם הוא אינו קיים, תצא אזהרה וביצוע הסקריפט ימשך. עבור טעינת הקובץ config עשינו שימוש בהצהרת require_once, מכיוון שהקובץ טוען הגדרות חיוניות של מסד הנתונים, שבלעדיהן לא ניתן יהיה להמשיך את ביצוע הסקריפט. עבור טעינת הקובץ header עשינו שימוש בהצהרת include_once, מכיוון שהקובץ טוען פרטי עיצוב שונים, שגם בלעדיהם ניתן יהיה להמשיך בביצוע הסקריפט.
טעינת קבצים דינמית
טעינת קובץ חיצוני יכולה להתבצע בצורה דינמית, כלומר, שהמחרוזת עם שם הקובץ תהיה מבוססת על משתנה.
דוגמה:
<?php
$page = 'home';
include "$page.php";
?>
בדוגמה זו, אנו טוענים אנו טוענים קובץ ששמו תלוי במשתנה page.
טעינת קבצים דינמית טובה במצבים בהם אנו נדרשים לטעון תבניות עיצוב שונות או הגדרות שונות בהתאם למצבים שונים, כגון הגדרות משתמש שונות.
ניתן ליצור טעינה מותנית בהתאם למצבים שונים בקוד.
דוגמה:
<?php
if (file_exists('config_special.php')) {
require 'config_special.php';
} else {
require 'config_default.php';
}
?>
בדוגמה זו, אנו בודקים אם קיים הקובץ config_special. אם הוא קיים, אנו טוענים אותו, אחרת אנו טוענים את הקובץ config_default.
מסלול ריילטיבי מול מסלול אבסולוטי
המסלול (path) בו נמצא הקובץ אותו טוענים יכול להיות אבסולוטי (מוחלט) או ריילטיבי (יחסי):
- מסלול אבסולוטי - מסלול הקובץ המלא על השרת. מתחיל תמיד בלוכסן (/).
- מסלול ריילטיבי - מסלול יחסי לספריה בה נמצא הקובץ הטוען. אינו מתחיל בלוכסן.
דוגמה:
<?php
// Absolute path
include '/var/www/html/file.php';
// Relative path
include 'subdir/file.php';
?>
בדוגמה זו, הקובץ הראשון שנטען הוא במסלול אבסולוטי (כיוון שהוא מתחיל בסימן /) ואילו הקובץ השני שנטען הוא במסלול ריילטיבי (כיוון שאינו מתחיל בסימן /).
יש לשים לב שמסלול ריילטיבי הוא יחסי לספריה בה נמצא הקובץ המריץ את הצהרת ה-include או ה-require, ולא יחסי לספריה הראשית שבה מורץ הקובץ הראשי של הסקריפט. נניח לדוגמה שאנו בונים פרוייקט גדול ב-PHP שכולל הרבה קבצים. הספריה home כוללת את קובץ ההפעלה הראשי של הפרוייקט ותיקיה פנימית בשם classes שמכילה את יתר קבצי הפרוייקט. טעינה ריילטיבית של קובץ בשם file מתוך הסקריפט הראשי תהיה עם המסלול הריילטיבי classes/file, בעוד שטעינה של אותו הקובץ בדיוק מתוך הקובץ file2 שגם נמצא בתיקיה classes (כלומר הקבצים file, file2 שניהם בתיקיה classes) תהיה על המסלול הריילטיבי file בלבד (ללא ההתחלה classes).
כדי לפתור את הבילבול וכדי לאפשר טעינה של קבצים ממקומות שונים ומספריות שונות של הפרוייקט באותה הצורה, ניתן להעזר במשתנה המיוחד __DIR__. משתנה זה כולל את הכתובת האבסולוטית של הספריה בה נמצא הסקריפט הראשי שהורץ.
דוגמה:
<?php
include __DIR__ . '/subdir/file.php';
?>
בדוגמה זו, המסלול של הקובץ הנטען מתחיל בתיקיה של סקריפט הריצה הראשי ולא של הקובץ הטוען.