فرق include و require و توضیح include_once و require_once در زبان PHP
یکی از مهمترین مباحث در هر زبان برنامهنویسی، امکان reusability یا «قابلیت استفاده مجدد» است. (re+use+ability)
تقریباً تمام زبانهای پیشرفته و سطح بالا امکانات مختلفی برای تأمین این قابلیت در نظر گرفتهاند.
یکی از آنها که در زبان PHP فراهم شده، این است که شما بخشی از یک کد که قرار است در فایلهای دیگر مورد استفاده مجدد قرار گیرد را در یک فایل بریزید و هر کجا که لازم بود دوباره از آن استفاده کنید، با استفاده از توابع include و یا require آنها را در اصطلاح import (وارد) کنید تا دیگر نیاز به نوشتن مجدد کدها نباشد.
تابع include():
مثلاً در صفحات مختلف همین سایت (آفتابگردان) شما میبینید که لوگوی سایت و منوهای بالا همیشه وجود دارند. ما نمیآییم هر بار در صدها صفحه، کدهای مربوط به آن لوگو و منوها را درج کنیم!
بلکه یک بار در فایلی به نام مثلاً header.php آنها را نوشتهایم و هر کجا که لازم بود این لوگو و منوها ظاهر شوند، نوشتهایم:
include 'header.php';
* چون include یک ساختار خاص در زبان PHP است نیازی به پرانتز دور نام فایل نیست. هر چند که آوردن آن هم مشکلی ایجاد نمیکند (مگر در مواقعی که قرار است مقایسه انجام گیرد. برای توضیحات بیشتر در مورد این مشکل، Example#4 در این صفحه را مشاهده کنید)
تابع require():
این تابع نیز عملکردی مشابه 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 شدن (پایان یافتن) اجرای کدها میشود.
تابع include_once() و require_once():
* کلمه once یعنی «یک بار».
در برنامهنویسیهای پیشرفته شما گاهی اوقات چند فایل را در هم ایمپورت میکنید. حالا تصور کنید شما در فایل index.php، فایل x و y را ایمپورت کردهاید. فایل x نیز خودش فایل y را درون خود ایمپورت کرده است. در این صورت شما دو بار فایل y را ایمپورت کردهاید. درست است؟ این کار اگر هم روال اجرای کدها را دچار مشکل نکند، باعث پردازش بیش از حد میشود.
پس، بهتر است از توابع include_once یا require_once استفاده کنید.
این توابع کمک میکنند که اگر قبلاً یک فایل را ایمپورت کردهاید و به هر دلیلی دوباره آن فایل ایمپورت میشود، بار دو (و سوم و ...) دیگر ایمپورت صورت نمیگیرد، اما طبیعتاً اگر قبلاً ایمپورت نشده بود، ایمپورت صورت میگیرید.
همین!
فرق آنها از نظر اینکه include یا require هستند نیز دقیقاً همان فرق دو تابع include و require است. یعنی include_once باعث میشود که اگر فایل مورد نظر پیدا نشد، بقیه کدها اجرا شوند. اما require_once از اجرای بقیه کدها جلوگیری میکند.
بسته به کاربرد، ممکن است هر کدام از این توابع به کار آیند. پس نمیشود گفت کدام بهتر از دیگری است. اما در کل، در حالت عادی، بهتر است از require_once استفاده کنید.
موفق باشید؛
حمید رضا نیرومند
.
- مطالب مرتبط:
- چگونه گزینه های انتخاب شده یک CheckBox را با کمک inputهای hidden به صفحه سوم منتقل کنیم؟
- در آمدی بر زبان PHP
- نوشتن بر روی عکس با GD در PHP
- آموزش نمایش تاریخ هجری شمسی با استفاده از PHP در صفحات وب
- نکاتی در مورد کار با URL در پی.اچ.پی (Working with addresses in PHP)
- چگونه با PHP از اطلاعات دیتابیس خروجی csv بگیریم که کاراکترها درست نمایش داده شوند؟
- ------------
- آموزش نمایش تاریخ هجری شمسی با استفاده از PHP در صفحات وب
- آموزش چک کردن آزاد بودن یا نبودن یک دامنه با PHP (و زبانهای دیگر)
- نکاتی در مورد مشکلات رشتهها و utf8 در زبان PHP
- بهترین راه درج NOW در MySQL با کمک PHP
- آموزش آپلود فایل از طریق یک فرم در پی.اچ.پی (How to upload a file in PHP)
ارسال سؤال یا نظر
1- ؟؟؟؟؟؟؟؟؟؟؟؟:
بوسیله: , در: Tuesday, 2011 April 05-کد: 3146
عکسهاتون باز نمیشه لطفا این رو هم یه توضیحی مختصر بدید که چطور میتونم بازشون کنم متشکرم
راستی ریاضیم هم قویتر شده ها
2- akram:
بوسیله: , در: Wednesday, 2011 April 13-کد: 3192
kheili khooooooob bood
3- علی رحمانی:
بوسیله: , در: Sunday, 2011 July 31-کد: 3371
عال بود
4- سعید:
بوسیله: , در: Friday, 2011 October 21-کد: 3591
سلام
بابت آموزش واقعن ممنون
فقط یه نکته اینکه شما در آخر گفتید که :
"اما در کل، در حالت عادی، بهتر است از require_once استفاده کنید."
چرا بهتره که از require_once استفاده کنیم
شاید یه مشکل کوچیک از اجرای بقیه ی کدها جلوگیری کنه
بهتر نیست بقیه ی کدها اجرا بشه و همه فدای این یه تیکه نشن؟
5- علی:
بوسیله: , در: Saturday, 2011 November 19-کد: 3650
@سعید
برای اینکه ممکنه مشکل امنیتی ایجاد کنه !
مثلا توی اون فایلی که include ش کردید یک تابع یا کلاس وجود داشته باشه که ورودی ها کنترل میشند که اگر اون قسمت مشکل به وجود بیاد همون مشکل به قول شما کوچک کل سایت رو بر باد میده !
6- سعید:
بوسیله: , در: Tuesday, 2011 December 13-کد: 3722
ممنون و سپاس
قانع شدم
7- وحید:
بوسیله: , در: Wednesday, 2012 February 15-کد: 3995
آموزشت بی نظیر بود
مرسی
8- امین:
بوسیله: , در: Monday, 2012 July 23-کد: 4650
فوق العاده بود
اجرکم عندالله
9- hamed:
بوسیله: , در: Tuesday, 2012 October 16-کد: 5096
من که چیزایه خوبی یاد گرفتم.ممنون
10- علیرضا:
بوسیله: , در: Tuesday, 2012 October 23-کد: 5140
خیلی واضح و عالی توضیح دادی
ممنون
مشاهده ادامه نظرات
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
عالی