سلام وقت تون بخیر
راستش خودم در حال یادگیری PHP هستم و دارم یک پروژه وب پیاده سازی میکنم. داشتم قسمت های مختلف پروژه ام رو که در جاهای مختلف استفاده میشد، بصورت کامپوننت میکردم تا هرجا ک خواستم فقط با استفاده از ("path/.)include فراخوانی و استفاده کنم.
داشتم سرچ میکردم که یهو چشمم به include_once خورد گفتم مگه چه فرقی داره خب؟ یکمی تحقیق و ...کردم و گفتم دربارش مقاله بنویسم تا هم خودم دیگ یادم نره و هم اولین پست ویرگولم باشه:)
خب بریم برای شروع ->
یکی از مهمترین مباحث در هر زبان برنامهنویسی، امکان reusability یا «قابلیت استفاده مجدد» است. تقریباً تمام زبانهای پیشرفته و سطح بالا امکانات مختلفی برای تأمین این قابلیت در نظر گرفتهاند.
یکی از آنها که در زبان PHP فراهم شده، این است که شما بخشی از یک کد که قرار است در فایلهای دیگر مورد استفاده مجدد قرار گیرد را در یک فایل بریزید و هر کجا که لازم بود دوباره از آن استفاده کنید، با استفاده از توابع include و یا require آنها را در اصطلاح import (وارد) کنید تا دیگر نیاز به نوشتن مجدد کدها نباشد.
برای مثال فرض کنید که تنظیمات و اطلاعات مربوط به دیتابیس، سرویسهای خارجی و غیره خود را در فایل config.php نوشتهایم، و توابع مورد نیاز را در فایل functions.php قرار دادهایم و میخواهیم در فایل اصلی index.php از آنها استفاده کنیم. باید هردو فایل را در index.php فراخوانی کنیم تا بتوانیم از آنچه نوشتهایم، در index.php استفاده کنیم.
در صفحات مختلف سایت ها شما میبینید که لوگوی سایت و منوهای بالا همیشه وجود دارند. آیا بنظرتون ما هر بار در تمام صفحه ها، کدهای مربوط به آن لوگو و منوها را دوباره درج کنیم؟ -> معلومه که نه
بلکه یک بار کد آنه را می نویسیم و در فایلی به نام مثلاً header.php آنها را ذخیره میکنیم و هر کجا که لازم بود این لوگو و منوها ظاهر شوند، فایل header.php را بصورت زیر فراخوانی میکنیم:
include 'header.php'; //بصورت زیر هم میشه نوشت include("header.php");
نکته: چون دستور include یک ساختار خاص در زبان PHP است نیازی به پرانتز دور نام فایل نیست. هر چند که آوردن آن هم مشکلی ایجاد نمیکند (مگر در مواقعی که قرار است مقایسه انجام گیرد. برای توضیحات بیشتر در مورد این مشکل، Example#4 در این صفحه را مشاهده کنید)
این تابع نیز عملکردی مشابه include دارد. با یک تفاوت کوچک که با یک مثال توضیح میدهم. فرض کنید فایلی به نام index.php داریم که در این فایل نوشتهایم:
<?php echo 'Line one'; include('header.php'); echo 'Line two'; ?>
حالا کدمون را اجرا کنیم بنظرتون اگر فایلی بنام header.php وجود نداشته باشه یا مسیر دهی مون غلط باشه چه اتفاقی میوفته؟ دقت کنید که از include استفاده کردیم.
درواقع مشکلی برای ادامه اجرای کدهای من پیش نمیآید. یعنی در خروجی داریم:
Line one
( ! ) Warning: include(./include/header.php): failed to open stream: No such file or directory in C:\xampp\htdocs\Sorna\index.php on line 108
Line two
همانطور که میبینید، Line two نیز چاپ شده است. یعنی ادامه دستورات فایل index.php اجرا میشود.
اما اگر از require استفاده کنم. یعنی فایل index.php اینطور باشد:
<?php echo 'Line one'; require 'header.php'; echo 'Line two'; ?>
این بار اگر header.php پیدا نشود، ادامه کدهای index.php اجرا نمیشود! خروجی را ببینید:
Line one ( ! ) Warning: require(header.php): failed to open stream: No such file or directory in C:\xampp\htdocs\Sorna\Sorna\index.php on line 11 ( ! ) Fatal error: require(): Failed opening required 'dbh.inc.php' (include_path='C:\xampp\php\PEAR') in C:\xampp\htdocs\Sorna\index..php on line 11
همانطور که میبینید، این بار عبارت Line two چاپ نشد، چون قبل از آن، عملیات اینکلود کردن فایل header.php با شکست مواجه شده و تابع require میگوید که بقیه کدها نباید اجرا شوند!
در اصطلاح گفته میشود تابع require در صورت پیدا نکردن فایل، یک Fatal Error بر میگرداند و باعث پایان یافتن اجرای کدها میشود.
خب کلمه once یعنی "یک بار".
در پروژه هاتون گاهی اوقات چند فایل را در هم ایمپورت میکنید. حالا تصور کنید شما در فایل index.php، فایل x و y را ایمپورت کردهاید. داخل فایل x، فایل y نیز ایمپورت شده است. در این صورت شما دو بار فایل y را ایمپورت کردهاید. درست است؟ این کار اگر هم روال اجرای کدها را دچار مشکل نکند، باعث پردازش بیش از حد میشود.
پس، بهتر است از توابع include_once یا require_once استفاده کنید.
این توابع کمک میکنند که اگر قبلاً یک فایل را ایمپورت کردهاید و به هر دلیلی دوباره آن فایل ایمپورت میشود، بار دو (و سوم و ...) دیگر ایمپورت صورت نمیگیرد، اما طبیعتاً اگر قبلاً ایمپورت نشده بود، ایمپورت صورت میگیرید.
تفاوت این تابع ها دقیقاً مثل دو تابع include و require است. یعنی include_once باعث میشود که اگر فایل مورد نظر پیدا نشد، بقیه کدها اجرا شوند. اما require_once از اجرای بقیه کدها جلوگیری میکند.
در مثال زیر تفاوت include_once را با include یا require_once را با require بصورت عملی ببینیم پس:
temp.php
<?php echo "Hello Dear!" ?>
index.php
<?php require 'temp.php'; // کامنت require_once 'temp.php'; ?>
اگر فایل index.php را اجرا کنیم، تنها یک بار عبارت "!Hello Dear" چاپ میشود، زیرا در خط چهارم از تابع require_once استفاده کردهایم. این تابع بررسی میکند که آیا این فایل پیش از این فراخوانی شده است یا نه، و در صورتی که پاسخ مثبت باشد، دیگر فراخوانی نخواهد شد. اگر بجای آن از require استفاده میشد، عبارت "!Hello Dear" دو بار چاپ میشد، زیرا فراخوانی دو بار اتفاق میافتاد.
خب تموم شد، یکمی زیاد شد ولی خب دیگ لازم بود بنظرم:)
امیدوارم مفیده باشه براتون و تونسته باشم تا جای ممکن مبحث رو ساده و واضح بیان کرده باشم. نظری انتقادی بود سرپا گوشیم:)
منابع استفاده شده: 1-سایت آفتاب گردان 2-WebPajooh