یکی از مهمترین مباحث در هر زبان برنامهنویسی، امکان reusability یا «قابلیت استفاده مجدد» است. (re+use+ability)
تقریباً تمام زبانهای پیشرفته و سطح بالا امکانات مختلفی برای تأمین این قابلیت در نظر گرفتهاند.
یکی از آنها که در زبان PHP فراهم شده، این است که شما بخشی از یک کد که قرار است در فایلهای دیگر مورد استفاده مجدد قرار گیرد را در یک فایل بریزید و هر کجا که لازم بود دوباره از آن استفاده کنید، با استفاده از توابع include و یا require آنها را در اصطلاح import (وارد) کنید تا دیگر نیاز به نوشتن مجدد کدها نباشد.
مثلاً در صفحات مختلف همین سایت شما میبینید که لوگوی سایت و منوهای بالا همیشه وجود دارند. ما نمیآییم هر بار در صدها صفحه، کدهای مربوط به آن لوگو و منوها را درج کنیم!
بلکه یک بار در فایلی به نام مثلاً header.php آنها را نوشتهایم و هر کجا که لازم بود این لوگو و منوها ظاهر شوند، نوشتهایم:
include 'header.php';
* چون include یک ساختار خاص در زبان PHP است نیازی به پرانتز دور نام فایل نیست. هر چند که آوردن آن هم مشکلی ایجاد نمیکند.
این تابع نیز عملکردی مشابه include دارد. با یک تفاوت کوچک که با یک مثال توضیح میدهم:
فرض کنید فایلی به نام index.php داریم. من در این فایل نوشتهام:
این فایل را اجرا میکنم. اگر فایل header.php به هر دلیلی (مثل آدرسدهی غلط، یا پاک شدن فایل) پیدا نشود، مشکلی برای ادامه کدهای من پیش نمیآید. یعنی در خروجی خطا می دهد.
اما اگر از require استفاده کنم. یعنی فایل index.php اینطور باشد:
این بار اگر header.php پیدا نشود، ادامه کدهای index.php اجرا نمیشود!
همانطور که میبینید، این بار عبارت Line #2 در خروجی نیامد، چون قبل از آن، عملیات ایمپورت کردن فایل header.php با شکست مواجه شده و تابع require میگوید که بقیه کدها نباید اجرا شوند!
در اصطلاح گفته میشود تابع require در صورت پیدا نکردن فایل، یک Fatal Error بر میگرداند و باعث halt شدن (پایان یافتن) اجرای کدها میشود.
* کلمه once یعنی «یک بار».
در برنامهنویسیهای پیشرفته شما گاهی اوقات چند فایل را در هم ایمپورت میکنید. حالا تصور کنید شما در فایل index.php، فایل x و y را ایمپورت کردهاید. فایل x نیز خودش فایل y را درون خود ایمپورت کرده است. در این صورت شما دو بار فایل y را ایمپورت کردهاید. درست است؟ این کار اگر هم روال اجرای کدها را دچار مشکل نکند، باعث پردازش بیش از حد میشود.
پس، بهتر است از توابع include_once یا require_once استفاده کنید.
این توابع کمک میکنند که اگر قبلاً یک فایل را ایمپورت کردهاید و به هر دلیلی دوباره آن فایل ایمپورت میشود، بار دو (و سوم و ...) دیگر ایمپورت صورت نمیگیرد، اما طبیعتاً اگر قبلاً ایمپورت نشده بود، ایمپورت صورت میگیرید.
همین!
فرق آنها از نظر اینکه include یا require هستند نیز دقیقاً همان فرق دو تابع include و require است. یعنی include_once باعث میشود که اگر فایل مورد نظر پیدا نشد، بقیه کدها اجرا شوند. اما require_once از اجرای بقیه کدها جلوگیری میکند.
بسته به کاربرد، ممکن است هر کدام از این توابع به کار آیند. پس نمیشود گفت کدام بهتر از دیگری است. اما در کل، در حالت عادی، بهتر است از require_once استفاده کنید.
منبع : آفتابگردان