هفتهی پیش در مصاحبهای کاری (برای سمت توسعهدهندهی بکاند) شرکت کردم که یکی از پرسشهای مصاحبهکننده دربارهی require و include بود. با اینکه جوابی ناقص در خصوص متوقفشدن یا نشدن برنامه در تفاوت این دو گفتم، اما تصمیم گرفتم که مطلبی راجع به این موضوع بنویسم تا هم این معلومات برای خودم تثبیت شوند و هم دیگران استفاده کنند.
از هردوی آنها برای فراخوانی کدهای فایلی دیگر در جریان اسکریپت فعلی استفاده میکنیم. فرض کنید که تنظیمات و اطلاعات مربوط به دیتابیس، سرویسهای خارجی و غیره خود را در فایل config.php نوشتهایم، و توابع مورد نیاز را در فایل functions.php قرار دادهایم و میخواهیم در فایل اصلی index.php از آنها استفاده کنیم. باید هردو فایل را در index.php فراخوانی کنیم تا بتوانیم از آنچه نوشتهایم، در index.php استفاده کنیم.
در صورتی که PHP نتواند فایل فراخونی شده را بیابد، در صورت استفاده از include یک E_WARNING و در صورت استفاده از require یک E_ERROR را برمیگرداند. پس در صورت استفاده از include با بروز یک مشکل، اسکریپت متوقف نشده و همچنان ادامه خواهد داد، اما در require چنین نیست و اسکریپت با یک Fatal Error متوقف خواهد شد.
کلمهی E_ERROR به خطاهای مهلک زماناجرا (Fatal run-time errors) اشاره دارد که باعث متوقفشدن روند برنامه میشوند و E_WARNING به هشدارهای غیر مهلک زماناجرا اشاره دارد که بروزشان باعث توقف برنامه نمیشود. موارد دیگری مانند E_PARSE (خطاهای زمان کامپایل) و E_NOTICE (اعلانهای زمان اجرا) وجود دارند که همگی را در این بخش از مستندات پیاچپی خواهید یافت.
بین require و require_once (همچنین include و include_once) یک تفاوت جالب وجود دارد. به کد زیر توجه کنید:
core.php
<?php echo "Thinking...\n"
script.php
<?php require 'core.php'; // bla bla bla require_once 'core.php';
اگر فایل script.php را اجرا کنیم، تنها یک بار عبارت Thinking را مشاهده میکنیم، زیرا در دفعهی دوم از require_once استفاده کردهایم. با require_once، بررسی میشود که آیا این فایل پیش از این فراخوانی شده است یا نه، و در صورتی که پاسخ مثبت باشد، دیگر فراخوانی نخواهد شد. اگر بجای آن از require استفاده میشد، عبارت Thinking دو بار چاپ میشد، زیرا فراخوانی دو بار اتفاق میافتاد.
امیدوارم که برایتان مفید بوده باشد و پیشنهادات و انتقادات خود را دریغ نفرمایید.