یکی از مهمترین مباحث در هر زبان برنامهنویسی، امکان reusability یا «قابلیت استفاده مجدد» است. (re+use+ability)
تقریباً تمام زبانهای پیشرفته و سطح بالا امکانات مختلفی برای تأمین این قابلیت در نظر گرفتهاند.
یکی از آنها که در زبان PHP فراهم شده، این است که شما بخشی از یک کد که قرار است در فایلهای دیگر مورد استفاده مجدد قرار گیرد را در یک فایل بریزید و هر کجا که لازم بود دوباره از آن استفاده کنید، با استفاده از توابع include و یا require آنها را در اصطلاح import (وارد) کنید تا دیگر نیاز به نوشتن مجدد کدها نباشد.
مثلاً در صفحات مختلف همین سایت (آفتابگردان) شما میبینید که لوگوی سایت و منوهای بالا همیشه وجود دارند. ما نمیآییم هر بار در صدها صفحه، کدهای مربوط به آن لوگو و منوها را درج کنیم!
بلکه یک بار در فایلی به نام مثلاً header.php آنها را نوشتهایم و هر کجا که لازم بود این لوگو و منوها ظاهر شوند، نوشتهایم:
include 'header.php';
* چون include یک ساختار خاص در زبان PHP است نیازی به پرانتز دور نام فایل نیست. هر چند که آوردن آن هم مشکلی ایجاد نمیکند (مگر در مواقعی که قرار است مقایسه انجام گیرد. برای توضیحات بیشتر در مورد این مشکل، Example#4 در این صفحه را مشاهده کنید)
این تابع نیز عملکردی مشابه include دارد. با یک تفاوت کوچک که با یک مثال توضیح میدهم:
فرض کنید فایلی به نام index.php داریم. من در این فایل نوشتهام:
این فایل را اجرا میکنم. اگر فایل header.php به هر دلیلی (مثل آدرسدهی غلط، یا پاک شدن فایل) پیدا نشود، مشکلی برای ادامه کدهای من پیش نمیآید. یعنی در خروجی داریم:
همانطور که میبینید، Line #2 نیز چاپ شده است. یعنی ادامه دستورات فایل index.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 استفاده کنید.
موفق باشید؛
حمید رضا نیرومند
11- مصطفی:
بوسیله: , در: Monday, 2012 December 03-کد: 5518
سلام.
آموزش عالی بود/ منتهی سوالی دارم و اونم اینکه استفاده زیاد از اینکلود مشکل ایجاد نمیکنه؟ یا نه بهتر هم میشه واسه پردازش و سرعت؟
به طور مثال کدها رو بشکنیم و اونا رو مثلا در ایندکس ایمپورت کنیم/ حالا اگه تعداد ایمپورت ها مثلا در یک صفحه بشه 10 تا مشکلی نیست؟
12- saeed:
بوسیله: , در: Wednesday, 2013 January 23-کد: 6029
سلام دمت گرم عالی بود ممنون فداتتتتتتتتتتتتتتت
13- مهدی:
بوسیله: , در: Saturday, 2013 March 09-کد: 6385
مرسی. خیلی خوب بود .ممنونم ازتون
14- amir:
بوسیله: , در: Friday, 2013 April 19-کد: 6650
aly bood
15- kia:
بوسیله: , در: Saturday, 2013 December 14-کد: 8809
Very Good
16- مهدیه:
بوسیله: , در: Monday, 2013 December 16-کد: 8817
اموزش شما باعث پاک شدن یکی از علامتهای سوالم شد.بسیار بسیار ممنون
17- عطا:
بوسیله: , در: Monday, 2014 February 10-کد: 9490
سلام خسته نباشید.
من یه پلاگین واسه یه سیستم مدیریت محتوا نوشته بودم یه مشکلی داشتم که فقط یه بار فراخوانده میشد
include_once() .
2 روز درگیرش بودم . اصلآ یادم هم نمیومد که once گذاشتم و دقت نمیکردم اصلآ , تا اینکه این تاپیک خوندم یادم اومد از once استفاده کردم.
حالا مشکلم حل شد ...
آرزوی موفقیت و خسته نباشید دارم براتون.
18- :):
بوسیله: , در: Sunday, 2014 July 27-کد: 11085
دمت گرم
19- نسیم:
بوسیله: , در: Saturday, 2014 August 23-کد: 11398
عالییییییییییییییییییییییی
20- رضا :
بوسیله: , در: Monday, 2014 November 03-کد: 12211
با سلام
آقای مهندس نیرومند ، من php رو با نوشته ها و برنامه های شما شروع کردم و همیشه شما را استاد خودم می دونم . امیدوارم همیشه موفق و پیروز باشین .
رضا نوبری : تبریز
21- عباس:
بوسیله: , در: Wednesday, 2017 July 05-کد: 15233
سلامrnمن با دستوری include_once فایل منو و هدر و فوتر رو فراخوانی کردم ولی بعد از فراخوانی عدد یک رو یر میگردونه که ساختار صفحه رو بهم میریزهrnچطور باید کاری کنم که اون عدد و بر نگردوونه و فقط فراخوانی کنه؟ rnلطفا جواب بدین مرسی
22- سجاد:
بوسیله: , در: Wednesday, 2019 August 07-کد: 16075
تشکر از آموزشتون rnخوب و با جزئیات
23- فرید:
بوسیله: , در: Sunday, 2020 June 14-کد: 16356
ممنون دمت گرم
24- سجاد:
بوسیله: , در: Thursday, 2020 September 03-کد: 16409
سلام ممنون عالی بود.rnrnفقط یه سوال وقتی میشه طوری تعریف کرد که یکبار فقط ایمپورت بشه خب چرا همیشه از حالات once استفاده نکنیم ؟rnچه لزومی داره از require و include استفاده کرد وقتی باعث conflict میشه?
25- حسین:
بوسیله: , در: Wednesday, 2024 October 30-کد: 16754
عالی