سطح B: فراخوانی هوشمند و فایل‌های Config

در پروژه‌های پیچیده، فایل A فایل B را صدا می‌زند، فایل B فایل C را، و فایل C دوباره فایل A را! این حلقه‌ها باعث خطاهای مرگبار می‌شوند. بیایید یاد بگیریم چطور جلوی آن را بگیریم.

۱. مشکل: تعریف مجدد (Redeclare Error)

فرض کنید در فایلی به نام functions.php تابعی دارید که قیمت را محاسبه می‌کند. اگر این فایل را اشتباهاً دو بار در صفحه require کنید، PHP خطا می‌دهد:

Fatal error: Cannot redeclare calculate_price() (previously declared in functions.php:2)

۲. راه‌حل: پسوند _once

PHP دو دستور هوشمند دارد: include_once و require_once.

توصیه حرفه‌ای:

برای فایل‌هایی که شامل توابع (Functions)، کلاس‌ها یا تنظیمات (Config) هستند، همیشه از require_once استفاده کنید.


کارگاه عملی: فایل تنظیمات (Config)

بیایید یک "مرکز فرماندهی" کوچک برای سایتمان بسازیم.

فایل ۱: config.php
<?php
// تنظیمات کلی سایت
$site_name = "فروشگاه موبایل";
$currency = "تومان";
$admin_email = "admin@example.com";

// یک تابع کمکی
function formatPrice($price) {
    global $currency;
    return number_format($price) . " " . $currency;
}
?>
فایل ۲: product.php
<?php
// استفاده از _once برای اطمینان
require_once 'config.php';

// اگر اشتباهاً دوباره صدا بزنیم، هیچ خطایی رخ نمی‌دهد
require_once 'config.php'; 

echo "به " . $site_name . " خوش آمدید<br>";
echo "قیمت آیفون: " . formatPrice(50000000);
?>
نکته مهم حوزه متغیرها (Scope): متغیرهایی که در فایل اینکلود شده (`config.php`) هستند، در فایلی که آن را صدا زده (`product.php`) قابل دسترس هستند. انگار که کد آن‌ها در همان خط کپی شده باشد.

تمرین و چالش

تمرین: تم قابل تغییر

  1. یک فایل settings.php بسازید و متغیر $theme_color = 'blue'; را در آن بگذارید.
  2. یک فایل header.php بسازید که settings.php را require_once می‌کند.
  3. در هدر، با استفاده از متغیر $theme_color، رنگ پس‌زمینه منو را تغییر دهید (style="background-color: <?php echo $theme_color; ?>").
  4. حالا فایل header.php را در فایل اصلی ایمپورت کنید. با تغییر رنگ در فایل ستینگ، باید ظاهر سایت عوض شود.

چالش هوش مصنوعی: دیباگینگ (عیب‌یابی)

سناریو: یک برنامه‌نویس تازه‌کار از require معمولی استفاده کرده و با خطای "Cannot redeclare function" مواجه شده است. اما او نمی‌داند دقیقاً کدام فایل را دو بار صدا زده است (چون فایل‌ها تو در تو هستند).

تکلیف: از هوش مصنوعی بخواهید یک روش برای پیدا کردن لیست تمام فایل‌هایی که تا این لحظه اینکلود شده‌اند به شما یاد بدهد.
(راهنمایی مخفی برای معلم: تابع get_included_files() پاسخ این سوال است).

پاسخ هوش مصنوعی و لیست فایل‌های اینکلود شده در تمرین خودتان را چاپ کنید.