شنبه ۱ دی ۱۴۰۳ |  عضویت / ورود

فرق include و require و توضیح include_once و require_once در زبان PHP


Monday, 2011 April 04   نویسنده: Hamid   تعداد بازدید: 22096 بار  #آموزش PHP‏   امتیاز متوسط: امتیازی داده نشده است

یکی از مهم‌ترین مباحث در هر زبان برنامه‌نویسی، امکان reusability یا «قابلیت استفاده مجدد» است. (re+use+ability)

تقریباً تمام زبان‌های پیشرفته و سطح بالا امکانات مختلفی برای تأمین این قابلیت در نظر گرفته‌اند.

یکی از آن‌ها که در زبان PHP فراهم شده، این است که شما بخشی از یک کد که قرار است در فایل‌های دیگر مورد استفاده مجدد قرار گیرد را در یک فایل بریزید و هر کجا که لازم بود دوباره از آن استفاده کنید، با استفاده از توابع include و یا require آن‌ها را در اصطلاح import (وارد) کنید تا دیگر نیاز به نوشتن مجدد کدها نباشد.

تابع include()‎:

مثلاً در صفحات مختلف همین سایت (آفتابگردان) شما می‌بینید که لوگوی سایت و منوهای بالا همیشه وجود دارند. ما نمی‌آییم هر بار در صدها صفحه، کدهای مربوط به آن لوگو و منوها را درج کنیم!

بلکه یک بار در فایلی به نام مثلاً header.php آن‌ها را نوشته‌ایم و هر کجا که لازم بود این لوگو و منوها ظاهر شوند، نوشته‌ایم:

include 'header.php';

* چون include یک ساختار خاص در زبان PHP است نیازی به پرانتز دور نام فایل نیست. هر چند که آوردن آن هم مشکلی ایجاد نمی‌کند (مگر در مواقعی که قرار است مقایسه انجام گیرد. برای توضیحات بیشتر در مورد این مشکل، Example#4 در این صفحه را مشاهده کنید)

تابع require()‎:

این تابع نیز عملکردی مشابه include دارد. با یک تفاوت کوچک که با یک مثال توضیح می‌دهم:

فرض کنید فایلی به نام index.php داریم. من در این فایل نوشته‌ام:

http://tutorials.aftab.cc/web_designing/php/defferences_between_include_and_require/include.png

این فایل را اجرا می‌کنم. اگر فایل header.php به هر دلیلی (مثل آدرس‌دهی غلط، یا پاک شدن فایل) پیدا نشود، مشکلی برای ادامه کدهای من پیش نمی‌‌آید. یعنی در خروجی داریم:

http://tutorials.aftab.cc/web_designing/php/defferences_between_include_and_require/include_warning_error.png

همانطور که می‌بینید، Line #2 نیز چاپ شده است. یعنی ادامه دستورات فایل index.php اجرا می‌شود.

 

اما اگر از require استفاده کنم. یعنی فایل index.php اینطور باشد:

http://tutorials.aftab.cc/web_designing/php/defferences_between_include_and_require/require.png

این بار اگر header.php پیدا نشود، ادامه کدهای index.php اجرا نمی‌شود! خروجی را ببینید:

http://tutorials.aftab.cc/web_designing/php/defferences_between_include_and_require/require_fatal_error.png

همانطور که می‌بینید، این بار عبارت 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 استفاده کنید.

 

موفق باشید؛
حمید رضا نیرومند

 


.



ارسال سؤال یا نظر


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
خیلی واضح و عالی توضیح دادی
ممنون

مشاهده ادامه نظرات
Tutorials ©