Різниця між вимагати, включати, вимагати_конце та включати_молець?


1213

На PHP:

  • Коли я повинен використовувати requireVS. include?
  • Коли я повинен використовувати require_onceVS. include_once?

3
PHP CodeSniffer говорить, що якщо файл включається умовно, використовуйте include_once (замість Requ_once).
Фархад

Відповіді:


1426

Є requireі include_onceтак само.

Тож ваше запитання має бути ...

  1. Коли я повинен використовувати requireVS. include?
  2. Коли я повинен використовувати require_oncevs.require

Відповідь на 1 описана тут .

Функція reque () є ідентичною для include (), за винятком того, що вона обробляє помилки по-різному. Якщо виникла помилка, функція include () генерує попередження, але сценарій продовжить виконання. Потрібно () генерує фатальну помилку, і сценарій зупиниться.

Відповідь на 2 можна знайти тут .

Оператор Requ_once () є ідентичним, що вимагає (), за винятком PHP перевірить, чи файл уже включений, і якщо так, не додавати (вимагати) його знову.


58
Розум, який вимагає (), виконує швидше, ніж requ_once (), тому, якщо ви впевнені, що немає дублювання, включає використання, вимагають ().
dialex

48
@DiAlex, requ_once повільніше, але майже не вимірюється.
Контракт професора Фолкена порушив

77
@DiAlex ... і, якщо виявиться, що файл насправді вже включений, то require_once()швидше буде двоє
Том,

11
@ Prof.Falken При яких обставинах потрібен той самий файл не один раз ?? Я не можу придумати його в своєму теперішньому наборі думок.
Weishi Zeng

17
@WeishiZeng для веб-сторінок можуть бути фрагменти HTML, які ви хочете включити не один раз.
Джеймс Бенінгер

406

Використовуйте

  • вимагати,
    коли файл вимагає ваша програма, наприклад важливий шаблон повідомлення або файл, що містить змінні конфігурації, без яких додаток не працює.

  • Requ_once,
    коли файл містить вміст, який би спричинив помилку при наступному включенні, наприклад function important() { /* important code */}, безумовно, потрібен у вашій програмі, але оскільки функції неможливо повторно декларувати, не слід знову включати.

  • включати, коли файл не потрібен і потік додатків слід продовжувати, коли його не знайдено, наприклад,
    відмінно підходить для шаблонів, що посилаються на змінні з поточної області чи щось

  • включити
    необов'язкові залежності, які можуть спричинити помилки при наступному завантаженні або, можливо, віддаленому включенні файлів, які ви не хочете статися двічі через накладні витрати HTTP

Але в основному, саме ви вирішувати, яким користуватися.


У мене PDO-з'єднання (до бази даних) . Чи варто використовувати який? include? include_once? require? require_once?
Шафізаде

6
Це має бути прийнятою відповіддю, оскільки вона відповідає коротким запитанням та посиланням на офіційний посібник, а не інша відповідь, що посилається лише на w3schools.
Даніель В.

9
дайте мені причину, чому б ви включили його, якщо це не потрібно?
Франциско Очоа

1
Я використовую шаблон для загального макета сторінки, який має такі розділи, як заголовки, стовпці, колонтитули тощо. Це дозволяє мені обслуговувати цей шаблон для кожної сторінки на сайті, і мені потрібно лише створити файли в структурі папок сторінки, визначаючи, що повинні перейти на кожну з цих позицій. Якщо я вирішив, що для сторінки не потрібна бічна панель, я просто залишаю цей файл у папці для цієї сторінки, і шаблон як і раніше працює добре, без цього файлу.
Джеймс Койл

301

Моя пропозиція - просто використовувати require_once99,9% часу.

Використання requireабо includeзамість цього означає, що ваш код не можна повторно використовувати в іншому місці, тобто сценарії, які ви втягуєте, насправді виконують код замість надання доступних класів або деяких бібліотек функцій.

Якщо вам потрібен / включаючи код, який виконується на місці, це процедурний код, і вам потрібно ознайомитися з новою парадигмою . Як об'єктно-орієнтоване програмування, функціональне програмування або функціональне програмування.

Якщо ви вже займаєтесь OO або функціональним програмуванням, використання include_onceв основному буде затримуватися там, де в стеці ви знайдете помилки / помилки. Ви хочете знати, що функція do_cool_stuff()недоступна, коли ви підете на її дзвінок пізніше, або момент, коли ви очікуєте, що вона буде доступною , вимагаючи бібліотеку? Як правило, найкраще негайно дізнатися, чи є щось, що потрібно і очікується, недоступне, тому просто використовуйте require_once.

Крім того, в сучасному OOP просто завантажте свої класи під час використання.


41
+1 Це має бути прийнятою відповіддю. Ключові моменти - це те, що includeсім'я зазвичай є відвертою поганою ідеєю (тому що досить рідко можна включати файли, у яких є будь-які можливості не існувати), і що поза, require_onceі requireвам слід використовувати, require_onceвключаючи файли, які визначають функції або класи які використовуються в іншому місці, або інстанціювати одиночні елементи, як об'єкти підключення до бази даних, і використовувати requireдля включення файлів, які негайно роблять речі, коли вони включаються. У будь-якому великому веб-додатку останній тип включення є незвичним.
Марк Амері

7
+1 (мати ще один золотий знак;)) Погодьтеся, що розумно require_onceнайімовірніше, що кандидат може використовуватися майже весь час. З огляду на невеликі накладні відмінності між варіантами, які requireзабезпечують зупинку сценарію, я не можу придумати багато сценаріїв, де програма може вижити без включення файлу. І _onceзахищає від дурних питань. Той, хто не погоджується, швидше за все, знає, що робить, може вибрати, що підходить для програми чи сценарію.
Джеймс

ей, у мене є файл, який іноді включається в індексну сторінку і людина називається безпосередньо (home.php) ........... тепер я вже включений конфігураційний файл на сторінці індексу з функцією вимагати, тепер я можу використовувати requ_once у home.php для запобігання повторному включенню
Ravinder Payal

@RavinderPayal Ну, моя перша порада - врятувати собі головний біль за допомогою переднього контролера! Тільки тому, що користувач дзвонить example.com/home не означає, що у вас повинен бути абсолютно окремий home.php! Натомість / home / повинен просто пройти через передній контролер index.php або front.php. Тільки php дійсно дозволяє підходити до старої школи "один сценарій на сторінку", і, повірте, це не найкращий спосіб. Але якщо ви ОБОВ'ЯЗКОВО маєте окремі home.php та index.php, то все, що МОЖЕ ВДОМУТЬСЯ, має бути у бібліотечному файлі чи шаблоні, ../templates/home.tpl або ../view/home.view.php ти знаєш?
Kzqai

його SNS і я вибираю один файл, одна сторінка підхід спочатку для легкої розробки та його великий стек файлів, які я не можу відтворити, і тепер я вирішив цю проблему, а інша причина того, що робити один файл однією сторінкою - це швидкість і менше контакт з жорстким диском зменшується кількість
включень

36

Різниця між функціями _once і без функцій _once: без коду _once буде включено знову, тоді як з функціями _once PHP відстежує включені файли та включить їх лише один раз.

Різниця між вимагають і включають: Якщо потрібний файл не знайдений, PHP призведе до фатальної помилки, тоді як для включення буде видано лише попередження.


1
Вау короткий і простий!
Влад

31

include() накине попередження, якщо воно не може містити файл, але решта скрипту буде запущена.

require()кине E_COMPILE_ERRORі зупинить сценарій, якщо він не може включати файл.

Функції include_once()та require_once()функції не включатимуть файл вдруге, якщо він уже включений.

Дивіться наступні сторінки документації:


22

Кожен раз, коли ви використовуєте, ви require_once()можете використовувати у файлі, щоб включити інший файл, коли вам потрібен викликаний файл лише один раз у поточний файл. Ось у прикладі у мене є test1.php.

<?php  
echo "today is:".date("Y-m-d");  
?>  

і в іншому файлі, який я назвав test2.php

<?php  
require_once('test1.php');  
require_once('test1.php');  
?>

оскільки ви переглядаєте m, який вимагає файлу test1 двічі, але цей файл буде включати test1 один раз, а для виклику вдруге це буде проігноровано. І без зупинки покаже вихід одноразово.

Кожного разу, коли ви використовуєте 'include_once () `, ви можете використовувати у файлі, щоб включити інший файл, коли вам потрібен файл, що викликається, більше одного разу у поточному файлі. Тут у прикладі я маю файл на ім'я test3.php.

<?php  
echo "today is:".date("Y-m-d");  
?> 

І в іншому файлі, який я назвав test4.php

<?php  
include_once('test3.php');  
include_once('test3.php');  
?>

як ви переглядаєте m, включаючи файл test3, він буде містити файл одноразово, але зупинить подальше виконання.


"Приклад краще, ніж порада"
Рамеш Кітсірі ХеттіАраччі

19

Використовуйте "включати" для багаторазових шаблонів PHP . Використовуйте "вимагати" для необхідних бібліотек.

"* _once" приємно, тому що він перевіряє, чи файл уже завантажений чи ні, але для мене це має сенс лише в "Requ_once".


18

Ви повинні зберігати визначення класів та функцій, організованих у файлах.

Використовувати require_once()для завантаження залежностей (класи, функції, константи).

Використовуйте require()для завантаження файлів, що нагадують шаблони .

Використовувати include_once()для завантаження необов'язкових залежностей (класи, функції, константи).

Використовуйте include()для завантаження додаткових файлів, що нагадують шаблони .


16

Відповідь через 7 років за 2018 рік

Це питання було задано сім років тому, і жодна з відповідей не дає практичної допомоги. У сучасному програмуванні PHP ви в основному використовуєте required_onceлише один раз для включення вашого класу автозавантажувачів (композиційний автозавантажувач часто), і він завантажує всі ваші класи та функції (файли функцій повинні бути явно додані, щоб composer.jsonфайл був доступний у всіх інших файлах). Якщо з будь-якої причини ваш клас не завантажується з автозавантажувача, ви використовуєте його require_onceдля завантаження.

Є деякі випадки, які нам потрібно використовувати require. Наприклад, якщо у вас дійсно велике визначення масиву, і ви не хочете додавати це до вихідного коду визначення вашого класу, ви можете:

 <?php
// arr.php
return ['x'=>'y'];

 <?php
//main.php
$arr= require 'arry.php'

Якщо файл, який ви маєте намір включити, містить щось виконуване або оголошує деякі змінні, які вам майже завжди потрібно використовувати require, тому що якщо ви використовуєте require_onceкрім першого місця, ваш код не буде виконуватися і / або ваші змінні не ініціюватимуть мовчки, викликаючи помилки, абсолютно важко визначити.

Там немає ніякого практичного застосування для випадку includeі на include_onceсамому справі.


+1 для згадування автонавантажувача. Однак останнє речення є спірним. Досить часто ви використовуєте include(), загорнутий у вихідний буфер, щоб реалізувати двигун шаблонів.
хаз

Крім того, враховуючи сучасні текстові редактори та сучасний PHP, майже ніхто не використовує require()для розділення великих файлів.
хаз

Я зіткнувся з тією ж проблемою при використанні require_onceдля PHPMailer всередині функції, і мій автозавантажувач визначає $mailзмінну, необхідну пізніше в коді, тому наступна require_onceігнорується, яка $mailне залишається ініціалізованою! рішення було просто використовувати requireпісля виклику функції.
Юссеф

@haz Чи є причина, яку ви не використовуєте requireв цих випадках?
PHPst

@ChristofferBubach LOL
PHPst

15

Різниця полягає в помилці, яку створюють команди. З require, файл, який ви хочете використовувати, дійсно необхідний і, таким чином, генерує, E_ERRORякщо його не знайти.

require()є ідентичним, за include() винятком випадків відмови, він також призведе до фатальної E_ERROR помилки рівня.

includeE_WARNINGпомилка створюється лише в тому випадку, коли вона не працює, яка є більш-менш безшумною.

Тому використовуйте його, якщо файл вимагає, щоб залишився код працював, і ви хочете, щоб сценарій вийшов з ладу, файл недоступний.


Для *_once():

include_once() може використовуватися в тих випадках, коли один і той же файл може бути включений та оцінений не один раз під час певного виконання сценарію, тому в цьому випадку це може допомогти уникнути проблем, таких як перевизначення функції, переназначення змінних значень тощо.

Це ж стосується і require_once()звичайно.


Посилання: require(),include_once()


requireдає E_COMPILE_ERROR, а не E_ERROR.
Yousha Aleayoub

Схоже, це змінилося за останні 7 років.
Фелікс Клінг

9

З вимогою файл повинен існувати, якщо його немає, то з’явиться помилка; тоді як з включити - якщо файл не існує, сторінка продовжуватиме завантаження.


8

Потрібні критичні частини, як-от авторизація та включають усі інші

Кілька комплектуючих - це дуже поганий дизайн, і цього потрібно уникати взагалі. Отже, * _once насправді не має значення.


7

Включити / вимагати, ви можете включати один і той самий файл також не один раз:

вимагати () ідентично включати (), за винятком помилки, це також призведе до фатальної помилки рівня E_COMPILE_ERROR. Іншими словами, він зупинить сценарій, тоді як include () видає лише попередження (E_WARNING), яке дозволяє продовжувати сценарій.

need_once / include_once

є ідентичним, щоб включити / вимагати, за винятком того, що PHP перевірить, чи файл уже включений, і якщо так, не включити (вимагати) його ще раз.


5

include()генерує попередження, коли не знайде файл, але require_once()створить фатальну помилку.

Інша справа, якщо файл включений раніше. Потім require_once()знову не включатимуть його.


5

Я використовував функцію, як показано нижче:

function doSomething() {
    require_once(xyz.php);
    ....
}

Були постійні значення, оголошені в xyz.php.

Я повинен викликати цю функцію doSomething () з іншого файлу скриптів PHP.

Але я спостерігав поведінку під час виклику цієї функції в циклі, для першої ітерації doSomething () отримував постійні значення всередині xyz.php, але пізніше кожна ітерація doSomething()не могла отримати постійні значення, оголошені вxyz.php .

Я вирішив свою проблему, перейшовши require_once()на include()оновлений doSomething()код, як показано нижче:

function doSomething() {
    include(xyz.php);
    ....
}

Тепер кожен виклик ітерації doSomething()отримує постійні значення, визначені в xyz.php.


4

З посібника :

require()є ідентичним, за include()винятком випадків відмови, він також призведе до фатальної E_COMPILE_ERRORпомилки рівня. Іншими словами, він зупинить сценарій, тоді як include()видає лише попередження ( E_WARNING), яке дозволяє продовжувати сценарій.

Те саме стосується _once()варіантів.


4

У епоху PSR-0 / PSR-4автозавантажувачів використання будь-яких висловлювань може бути абсолютно непотрібним, якщо все, що вам потрібно, - це зробити деякі функції / класи доступними для вашого коду (звичайно, вам все одно потрібно require_onceавтозавантажувати себе у вашому завантажувальному файлі та includeшаблонах, якщо ви як і раніше використовувати PHP як шаблон двигуна).


3

 

  1. Коли слід використовувати requireабо include?

    Функції requireта includeфункції виконують те саме завдання, тобто включають та оцінюють вказаний файл, але різниця requireвикликає фатальну помилку, коли вказане розташування файлу недійсне або за будь-яку помилку, тоді як includeгенерує попередження та продовжує виконання коду.

    Таким чином, ви можете використовувати цю requireфункцію в тому випадку, коли файл, який ви намагаєтеся включити, є серцем системи і може спричинити величезний вплив на решту коду, і ви можете використовувати цю includeфункцію, коли файл, який ви намагаєтеся включити, це простий файл, що містить якийсь менш важливий код.

    І моя особиста рекомендація (для менш важливого коду) полягає в тому, щоб виконувати requireфункцію скрізь у своєму коді, поки вона знаходиться у фазі розробки, щоб ви могли налагодити код і пізніше замінити всі requireфункції includeфункцією, перш ніж перенести його на виробництво таким чином, що якщо ви пропустите будь-які помилки це не вплине на кінцевого користувача, а решта коду належним чином виконується ...

  2. Коли слід використовувати require_onceабо require?

    Основна різниця між requireі require_onceполягає в тому, require_onceщоб перевірити, включений чи ні файл, якщо він вже включений, він не буде включати файл, тоді як requireфункція буде включати файл незалежно від того, включений він чи ні.

    Тож у випадках, коли ви хочете знову і знову включити якийсь фрагмент коду, використовуйте requireфункцію, тоді як якщо ви хочете включити якийсь код лише один раз у свій код, використовуйте require_once.


2
  1. Використовуйте функцію вимагати, коли вам потрібно завантажити будь-який клас, функцію чи залежність.

  2. Використовуйте функцію " включити", коли потрібно завантажити файл у стилі шаблону

Якщо ви все ще плутаєтеся, просто використовуйте Requ_once на весь час.


1

Вони всі способи включення файлів.

Вимагати - значить, вона цього потребує. Require_once означає, що він знадобиться йому, але вимагає лише одного разу. Включити означає, що він буде містити файл, але його не потрібно продовжувати.

Приклади:

Require 'filename'
Require_once 'filename'
Include 'filename'

Існує також функція include_once, яка включає файл один раз.

Include_once 'filename'

Не використовуйте великі літери там, де я є, коли я друкую з телефону.


1

одне, що я помітив, при використанні include я можу отримати доступ до функцій, що входять до файлів, лише з файлу, що входить до нього. За допомогою Requ_once я можу запустити цю функцію у другому файлі Requir_once.

також: рекомендую додати

if(file_exists($RequiredFile)){
    require_once($RequiredFile);
}else{
  die('Error: File Does Not Exist');
}

Оскільки, коли Requ_once вбиває сторінку, вона іноді може перегукуватися з каталогом файлів вашого веб-сайту

Ось спеціальна функція, яку я зробив, щоб вимагати файлів:

function addFile($file, $type = 'php', $important=false){
    //site-content is a directory where I store all the files that I plan to require_once
    //the site-content directory has "deny from all" in its .htaccess file to block direct connections
    if($type && file_exists('site-content/'.$file.'.'.$type) && !is_dir('site-content/'.$file.'.'.$type)){
        //!is_dir checks that the file is not a folder
        require_once('site-content/'.$file.'.'.$type);
        return 'site-content/'.$file.'.'.$type;
    }else if(!$type && file_exists('site-content/'.$file) && !is_dir('site-content/'.$file)){
        //if you set "$type=false" you can add the file type (.php, .ect) to the end of the "$file" (useful for requiring files named after changing vars)
        require_once('site-content/'.$file);
        return 'site-content/'.$file;
    }else if($important){
        //if you set $important to true, the function will kill the page (which also prevents accidentally echoing the main directory path of the server)
        die('Server Error: Files Missing');
        return false;
    }else{
        //the function returns false if the file does not exist, so you can check if your functions were successfully added
        return false;
    }
}

приклад використання:

$success = addFile('functions/common');

if($success){
    commonFunction();
}else{
    fallbackFunction();
}

0

В основному, якщо вам потрібен неправильний шлях, PHP видає фатальну помилку і викликається функція відключення, але коли ви включите неправильний шлях, PHP продовжить виконання, але він просто відображатиме попередження про те, що файл не існує.

З англійського слова need , PHP сказано, що виконання сторінки або файлу залежить від необхідного файлу.

З мого досвіду, нормально вимагати важливих файлів, таких як файли конфігурації, класи баз даних та інші важливі утиліти.


0

Часто питання полягає в тому, чи хочете ви умовно завантажувати клієнтську бібліотеку, чи продовжуєте завантажувати її, чи не збираєтесь ви її використовувати.

Ось конкретний приклад; детальніше про те, що сказав pcj.

Скажімо, у вас є файл конфігурації, який зберігає ім’я користувача та пароль вашої бази даних (conf.php):

<?php
//my site configuration file

//For Database
$location='localhost';
$dbuser='yourname';
$userpw='yourpassword';
$database='nameofdatabase';
?>

І клас зі статичною функцією, яка використовує базу даних:

<?php
class UsedInLoop {
    public static function databaseQuery(){
        require(/path/to/conf.php);                //require_once will not work here
        $db = new mysqli($location, $dbuser, $userpw, $database);
        //yada yada yada
    }
}
?>

І ця статична функція використовується всередині іншої функції, яка називається ітеративно всередині циклу:

<?php
require_once('path/to/arbitraryObject.php');  //either will likely be OK at this level
$obj = new arbitraryObject();
foreach($array as $element){
    $obj->myFunction();
}
?>

Ви можете вимагати / включати клас лише один раз. Якщо вам потрібно / включити її до кожної ітерації циклу, ви отримаєте помилку. Однак вам потрібно включати конф-файл щоразу, коли викликається статична функція.

<?php
class arbitraryObject {
    public function myFunction(){
        require_once(/path/to/UsedInLoop.php);   //This must be require_once. require() will not work
        UsedInLoop::databaseQuery();
    }
}
?>

Звичайно, переміщення його поза функцією може бути вирішенням цієї проблеми:

<?php
require(/path/to/UsedInLoop.php);   //now require() is fine   
class arbitraryObject {
    public function myFunction(){
        UsedInLoop::databaseQuery();
    }
}
?>

Якщо ви не переймаєтеся накладними витратами на завантаження класу, який може використовуватися лише в певних умовах, і не хочете завантажувати його, коли його немає.


-1

requireмає великі накладні витрати, ніж include, оскільки він повинен спочатку розібрати файл. Заміна requiresна includesчасто є хорошою технікою оптимізації.


2
Я знаю, що це пізній коментар, але це насправді не так. requireбільше не аналізує файл include. У _onceверсії цих функцій кожен має трохи накладних витрат, але , як і інші говорили, що це близько до незначним в більшості додатків.
ahouse101

-2

Просто використовуйте вимагають і включайте.

Тому що подумайте, як працювати з include_once або Requ_once. Це шукає дані журналу, які зберігають включені або потрібні файли PHP. Так що це повільніше, ніж включати та вимагати.

if (!defined(php)) {
    include 'php';
    define(php, 1);
}

Просто використовуючи так ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.