Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: require, require_once, include и include_once - что лучше?
 
 автор: Bvz   (17.11.2008 в 13:18)   письмо автору
 
 


<?php require_once( 'db/dbconnect.php'); ?>
<?php 
require( 'db/dbconnect.php'); ?>
<?php 
include_once( 'db/dbconnect.php'); ?>
<?php 
include( 'db/dbconnect.php'); ?>

  Ответить  
 
 автор: sim5   (17.11.2008 в 13:34)   письмо автору
 
   для: Bvz   (17.11.2008 в 13:18)
 

Оператор require_once() подключает/include и вычисляет специфицированный файл в процессе выполнения скрипта. Это поведение напоминает оператор require() с той только разницей, что, если код из файла уже был подключён, он не будет подключён ещё раз. См. в документации к require() информацию о работе этого оператора.

require_once() должна использоваться в тех случаях, когда один и тот же файл может быть подключён и вычислен более одного раза в процессе определённого выполнения скрипта, а вы хотите иметь уверенность, что он включён точно один раз, чтобы избежать проблем с повторным определением функций, переназначениями переменных etc.

Оператор require() подключает/include и вычисляет определённый файл.

require() и include() идентичны почти во всём, за исключением того, как они обрабатывают неудачное выполнение. include() выдаёт Warning!, а require() выдаёт Fatal Error. Иначе говоря, не бойтесь использовать require(), если вам нужно, чтобы отсутствующий файл останавливал обработку страницы. include() не работает таким образом: скрипт всё равно продолжит работу. Убедитесь также в наличии соответствующей установки include_path.

Примечание: до версии PHP 4.0.2 применялись следующие правила: require() всегда пыталась читать файл назначения, даже если строка, в которой он указан никогда не выполнялась. Условный оператор не влиял на require(). Однако, если строка, в которой появляется require(), не выполнялась, не выполнялся и никакой код целевого файла. Аналогично циклические структуры не влияли на поведение require(). Хотя код, содержащийся в целевом файле, всё ещё является субъектом цикла, сама require() появлялась только один раз.

Оператор include_once() подключает и вычисляет специфицированный файл в ходе выполнения скрипта. Поведение аналогично оператору include(), но, если код файла уже был подключён, он не будет подключён вновь. Как следует из названия, он будет подключён только однократно.

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

Оператор include() подключает и вычисляет специфицированный файл.

Нижеследующая документация применима также к require(). Эти две конструкции идентичны во всём, кроме обработки облома. include() выводит Warning!, а require() выдаёт Fatal Error. Иначе говоря, используйте require(), если вы хотите, чтобы отсутствие файла останавливало процессинг страницы. include() не работает таким образом, скрипт продолжит выполнение. Не забудьте также о соответствующей установке include_path.

Когда файл подключён/included, содержащийся в нём код наследует область видимости переменной строки, на которой возникло подключение. Любые переменные, доступные на этой строке в вызывающем файле, будут доступны в вызываемом файле, вперёд от этой точки.

Если подключение возникает внутри функции в вызывающем файле, то весь код, содержащийся во включаемом файле, будет работать так, как если бы он был определён внутри. Так что он будет следовать области видимости переменной.

Когда файл подключается, разбор переходит из режима PHP в режим HTML в начале целевого файла и вновь продолжает после конца. Исходя из этого, любой код внутри файла назначения, который должен выполняться как PHP-код, обязан быть заключён в правильные стартовый и конечный тэги РНР.

Если "URL fopen-оболочки" включены в PHP (как в конфигурации по умолчанию), вы можете специфицировать файл, подключаемый с использованием URL (через HTTP), вместо локального pathname. Если целевой сервер интерпретирует целевой файл как PHP-код, переменные могут передаваться в подключаемый файл с использованием URL-строки запроса, как в HTTP GET. Строго говоря, это не то же самое, что подключение файла и наследование им области видимости переменных родительского файла; ведь скрипт работает на удалённом сервере, а результат затем подключается в локальный скрипт.

Поскольку include() и require() являются специальными конструкциями языка, вы обязаны заключить их в блок операторов, если это внутри условного блока.

Обработка возвращает: можно выполнить оператор return() внутри подключённого файла, чтобы прервать обработку этого файла и возвратиться в скрипт, вызвавший его. Также можно возвращать значения из подключённых файлов. Вы можете принять значение вызова include как обычно.

Примечание: в PHP 3 возвращаемое значение может не появиться внутри блока, если это не блок функции; в этом случае return() применяется к этой функции, а не ко всему файлу.

PS. Примеры смотрите в официальном мануале.

  Ответить  
 
 автор: Bvz   (17.11.2008 в 13:45)   письмо автору
 
   для: sim5   (17.11.2008 в 13:34)
 

спасибо за исчерпывающий ответ, мне важно,что из этого предпочтительнее

  Ответить  
 
 автор: cheops   (17.11.2008 в 13:56)   письмо автору
 
   для: Bvz   (17.11.2008 в 13:45)
 

Предпочтительнее для чего? Эти конструкции предназначены для одной задачи, но с разными ньюансами, если у вас в файле объявление функций необходимо использовать once-варианты, если необходимо несколько раз включать файл - нужны варианты без once. Если без включаемого файла приложение будет рабоать не правильно требуется require, если без включаемого файла что-то разумное можно будет сделать - лучше ориентироваться на include.

  Ответить  
 
 автор: Bvz   (17.11.2008 в 14:03)   письмо автору
 
   для: cheops   (17.11.2008 в 13:56)
 

например для подключения к БД
<?php require_once( 'db/dbconnect.php'); ?>

dbconnect.php
<?php

$id_con
=mysql_connect("localhost""root""")
or die(
"Невозможно соединиться с сервером!");
mysql_select_db("sb") or die("Невозможно выбрать базу данных!");

?>

  Ответить  
 
 автор: cheops   (17.11.2008 в 14:06)   письмо автору
 
   для: Bvz   (17.11.2008 в 14:03)
 

Совершенно верно, второй раз устанавливать соединение нет необходимости, а без базы данных приложение действительно вряд ли будет сколько нибудь работоспособным.

  Ответить  
 
 автор: Bvz   (17.11.2008 в 14:20)   письмо автору
 
   для: cheops   (17.11.2008 в 14:06)
 

<?php 

$id_con
=mysql_connect("localhost""root"""
or die(
"Невозможно соединиться с сервером!"); 
mysql_select_db("sb") or die("Невозможно выбрать базу данных!"); 

?>


а насколько этот код правилен? или можно его улучшить?

<?php  
$id_con 
mysql_connect("localhost","root","")or die ('Невозможно соединиться с сервером:' mysql_error()); 
mysql_select_db("sb",$id_con )or die ('Невозможно выбрать базу данных:' mysql_error()); 
@
mysql_query("SET NAMES 'utf8'");

например так

  Ответить  
 
 автор: STEVER   (10.02.2009 в 22:17)   письмо автору
 
   для: Bvz   (17.11.2008 в 14:20)
 

В продолжении темы напишу,
а кто разбирался по какому принципу работает этот "_once"?
- название файла
- абсолютный путь
- образ(хэш)
?
Если есть ссылки на ман - буду весьма благодарен.

  Ответить  
 
 автор: AcidTrash   (10.02.2009 в 22:25)   письмо автору
 
   для: STEVER   (10.02.2009 в 22:17)
 

>- название файла
Он там и указан.

>- абсолютный путь
Хотите, делайте абсолютный путь.

>- образ(хэш)
Вот это не понял, что имеется ввиду.

  Ответить  
 
 автор: STEVER   (10.02.2009 в 22:32)   письмо автору
 
   для: AcidTrash   (10.02.2009 в 22:25)
 

Прошу прощения, но мне кажется вам стоит более внимательно читать вопрос.
Я спрашивал не что мне делать, а по какому принципу работает _once (т.е. проверка на то чтобы конкретный файл подключился только один раз).

  Ответить  
 
 автор: AcidTrash   (10.02.2009 в 22:36)   письмо автору
 
   для: STEVER   (10.02.2009 в 22:32)
 

>т.е. проверка на то чтобы конкретный файл подключился только один раз
Это вы не внимательно читаете всю тему.
Цитирую фразу из поста sim5
Оператор require_once() подключает/include и вычисляет специфицированный файл в процессе выполнения скрипта. Это поведение напоминает оператор require() с той только разницей, что, если код из файла уже был подключён, он не будет подключён ещё раз. См. в документации к require() информацию о работе этого оператора.

  Ответить  
 
 автор: STEVER   (10.02.2009 в 22:38)   письмо автору
 
   для: AcidTrash   (10.02.2009 в 22:36)
 

Ну и где ответ на мой вопрос?
Хорошо, вы процитировали:
"код из файла уже был подключён, он не будет подключён ещё раз"
- так вот я спрашиваю: по какому принципу движок ПХП определяет что файл УЖЕ был подключен.

  Ответить  
 
 автор: Trianon   (10.02.2009 в 22:40)   письмо автору
 
   для: STEVER   (10.02.2009 в 22:38)
 

считает.

  Ответить  
 
 автор: STEVER   (10.02.2009 в 22:45)   письмо автору
 
   для: Trianon   (10.02.2009 в 22:40)
 

Trianon,
не могли бы вы более подробно рассказать алгоритм на уровне ядра?

  Ответить  
 
 автор: Trianon   (10.02.2009 в 22:48)   письмо автору
 
   для: STEVER   (10.02.2009 в 22:45)
 

-

  Ответить  
 
 автор: AcidTrash   (10.02.2009 в 22:45)   письмо автору
 
   для: STEVER   (10.02.2009 в 22:38)
 

по какому принципу движок ПХП определяет что файл УЖЕ был подключен
Хм, интересно, а зачем вам такой интерес?
А по какому принципу, например компилятор определяет где ошибка?

  Ответить  
 
 автор: STEVER   (17.02.2009 в 20:03)   письмо автору
 
   для: AcidTrash   (10.02.2009 в 22:45)
 

"интересно, а зачем вам такой интерес?" - это типа "вы не отвечаете на мой ответ"?
"А по какому принципу, например компилятор определяет где ошибка?" - эх, компилятор ты мой дорогой. Прежде чем перечить кому-то сам наберись немного знаний, хорошо?

  Ответить  
 
 автор: AcidTrash   (17.02.2009 в 22:53)   письмо автору
 
   для: STEVER   (17.02.2009 в 20:03)
 

Прежде чем перечить кому-то сам наберись немного знаний, хорошо?
Обязательно.

  Ответить  
 
 автор: BinLaden   (11.02.2009 в 00:05)   письмо автору
 
   для: STEVER   (10.02.2009 в 22:38)
 

PHP запоминает хеши абсолютных путей к файлам

  Ответить  
 
 автор: STEVER   (17.02.2009 в 20:05)   письмо автору
 
   для: BinLaden   (11.02.2009 в 00:05)
 

Благодарю за ответ, а ссылочки на док нет?
Trianon, утверждает что файл считывается(на сколько я понял образ файла?)

  Ответить  
 
 автор: BinLaden   (17.02.2009 в 20:12)   письмо автору
 
   для: STEVER   (17.02.2009 в 20:05)
 

В "доках", по-моему, такое не указывают. Надо в исходники смотреть.

> Trianon, утверждает что файл считывается(на сколько я понял образ файла?)
Считать и считывать -- вроде разные глаголы...

  Ответить  
 
 автор: Loki   (17.02.2009 в 22:11)   письмо автору
 
   для: BinLaden   (17.02.2009 в 20:12)
 

>В "доках", по-моему, такое не указывают. Надо в исходники смотреть.
Где как: насколько я помню в доках по mysql есть раздел где описываются алгоритмы, для лучшего понимания. Возможно и в PHP есть подобное, если достаточно глубоко копнуть:)

  Ответить  
 
 автор: BinLaden   (17.02.2009 в 22:16)   письмо автору
 
   для: Loki   (17.02.2009 в 22:11)
 

Было бы интересно взглянуть. Я не видел.

  Ответить  
 
 автор: STEVER   (21.02.2009 в 22:37)   письмо автору
 
   для: BinLaden   (17.02.2009 в 22:16)
 

Ладно я так понял никто не поможет, пошел копать исходники...
...
Нашел интересный коммент:
Optimized require_once() and include_once() by eliminating fopen(3) on second usage
....
....
...........
похже нашел:

switch (Z_LVAL(opline->op2.u.constant)) {
        case ZEND_INCLUDE_ONCE:
        case ZEND_REQUIRE_ONCE: {
                zend_file_handle file_handle;

                if (IS_ABSOLUTE_PATH(Z_STRVAL_P(inc_filename), Z_STRLEN_P(inc_filename))) {
                    cwd_state state;

                    state.cwd_length = 0;
                    state.cwd = malloc(1);
                    state.cwd[0] = 0;

                    failure_retval = (!virtual_file_ex(&state, Z_STRVAL_P(inc_filename), NULL, 1) &&
                        zend_hash_exists(&EG(included_files), state.cwd, state.cwd_length+1));

                    free(state.cwd);
                }

                if (failure_retval) {
                    /* do nothing */
                } else if (SUCCESS == zend_stream_open(Z_STRVAL_P(inc_filename), &file_handle TSRMLS_CC)) {

                    if (!file_handle.opened_path) {
                        file_handle.opened_path = estrndup(Z_STRVAL_P(inc_filename), Z_STRLEN_P(inc_filename));
                    }

                    if (zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path, strlen(file_handle.opened_path)+1)==SUCCESS) {
                        new_op_array = zend_compile_file(&file_handle, (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE) TSRMLS_CC);
                        zend_destroy_file_handle(&file_handle TSRMLS_CC);
                    } else {
                        zend_file_handle_dtor(&file_handle);
                        failure_retval=1;
                    }
                } else {
                    if (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE) {
                        zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename));
                    } else {
                        zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, Z_STRVAL_P(inc_filename));
                    }
                }
            }
            break;
        case ZEND_INCLUDE:
        case ZEND_REQUIRE:
            new_op_array = compile_filename(Z_LVAL(opline->op2.u.constant), inc_filename TSRMLS_CC);
            break;

  Ответить  
 
 автор: GeorgeIV   (18.02.2009 в 10:46)   письмо автору
 
   для: STEVER   (10.02.2009 в 22:38)
 

PHP в основе имеет СИ, и открывая файл эксклюзивно (открывая, а неоябязательно считывая, это разные вещи), вы не сможете более открыть это файл еще раз. Т.е. если указатель на файл уже инициализирован, то будет использоваться он, а не инициализироваться другой.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования