|
|
|
|
<?php require_once( 'db/dbconnect.php'); ?>
<?php require( 'db/dbconnect.php'); ?>
<?php include_once( 'db/dbconnect.php'); ?>
<?php include( 'db/dbconnect.php'); ?>
|
| |
|
|
|
|
|
|
|
для: 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. Примеры смотрите в официальном мануале. | |
|
|
|
|
|
|
|
для: sim5
(17.11.2008 в 13:34)
| | спасибо за исчерпывающий ответ, мне важно,что из этого предпочтительнее | |
|
|
|
|
|
|
|
для: Bvz
(17.11.2008 в 13:45)
| | Предпочтительнее для чего? Эти конструкции предназначены для одной задачи, но с разными ньюансами, если у вас в файле объявление функций необходимо использовать once-варианты, если необходимо несколько раз включать файл - нужны варианты без once. Если без включаемого файла приложение будет рабоать не правильно требуется require, если без включаемого файла что-то разумное можно будет сделать - лучше ориентироваться на include. | |
|
|
|
|
|
|
|
для: 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("Невозможно выбрать базу данных!");
?>
|
| |
|
|
|
|
|
|
|
для: Bvz
(17.11.2008 в 14:03)
| | Совершенно верно, второй раз устанавливать соединение нет необходимости, а без базы данных приложение действительно вряд ли будет сколько нибудь работоспособным. | |
|
|
|
|
|
|
|
для: 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'");
|
например так | |
|
|
|
|
|
|
|
для: Bvz
(17.11.2008 в 14:20)
| | В продолжении темы напишу,
а кто разбирался по какому принципу работает этот "_once"?
- название файла
- абсолютный путь
- образ(хэш)
?
Если есть ссылки на ман - буду весьма благодарен. | |
|
|
|
|
|
|
|
для: STEVER
(10.02.2009 в 22:17)
| | >- название файла
Он там и указан.
>- абсолютный путь
Хотите, делайте абсолютный путь.
>- образ(хэш)
Вот это не понял, что имеется ввиду. | |
|
|
|
|
|
|
|
для: AcidTrash
(10.02.2009 в 22:25)
| | Прошу прощения, но мне кажется вам стоит более внимательно читать вопрос.
Я спрашивал не что мне делать, а по какому принципу работает _once (т.е. проверка на то чтобы конкретный файл подключился только один раз). | |
|
|
|
|
|
|
|
для: STEVER
(10.02.2009 в 22:32)
| | >т.е. проверка на то чтобы конкретный файл подключился только один раз
Это вы не внимательно читаете всю тему.
Цитирую фразу из поста sim5
Оператор require_once() подключает/include и вычисляет специфицированный файл в процессе выполнения скрипта. Это поведение напоминает оператор require() с той только разницей, что, если код из файла уже был подключён, он не будет подключён ещё раз. См. в документации к require() информацию о работе этого оператора. | |
|
|
|
|
|
|
|
для: AcidTrash
(10.02.2009 в 22:36)
| | Ну и где ответ на мой вопрос?
Хорошо, вы процитировали:
"код из файла уже был подключён, он не будет подключён ещё раз"
- так вот я спрашиваю: по какому принципу движок ПХП определяет что файл УЖЕ был подключен. | |
|
|
|
|
|
|
|
для: STEVER
(10.02.2009 в 22:38)
| | считает. | |
|
|
|
|
|
|
|
для: Trianon
(10.02.2009 в 22:40)
| | Trianon,
не могли бы вы более подробно рассказать алгоритм на уровне ядра? | |
|
|
|
|
|
|
|
для: STEVER
(10.02.2009 в 22:45)
| | - | |
|
|
|
|
|
|
|
для: STEVER
(10.02.2009 в 22:38)
| | по какому принципу движок ПХП определяет что файл УЖЕ был подключен
Хм, интересно, а зачем вам такой интерес?
А по какому принципу, например компилятор определяет где ошибка? | |
|
|
|
|
|
|
|
для: AcidTrash
(10.02.2009 в 22:45)
| | "интересно, а зачем вам такой интерес?" - это типа "вы не отвечаете на мой ответ"?
"А по какому принципу, например компилятор определяет где ошибка?" - эх, компилятор ты мой дорогой. Прежде чем перечить кому-то сам наберись немного знаний, хорошо? | |
|
|
|
|
|
|
|
для: STEVER
(17.02.2009 в 20:03)
| | Прежде чем перечить кому-то сам наберись немного знаний, хорошо?
Обязательно. | |
|
|
|
|
|
|
|
для: STEVER
(10.02.2009 в 22:38)
| | PHP запоминает хеши абсолютных путей к файлам | |
|
|
|
|
|
|
|
для: BinLaden
(11.02.2009 в 00:05)
| | Благодарю за ответ, а ссылочки на док нет?
Trianon, утверждает что файл считывается(на сколько я понял образ файла?) | |
|
|
|
|
|
|
|
для: STEVER
(17.02.2009 в 20:05)
| | В "доках", по-моему, такое не указывают. Надо в исходники смотреть.
> Trianon, утверждает что файл считывается(на сколько я понял образ файла?)
Считать и считывать -- вроде разные глаголы... | |
|
|
|
|
|
|
|
для: BinLaden
(17.02.2009 в 20:12)
| | >В "доках", по-моему, такое не указывают. Надо в исходники смотреть.
Где как: насколько я помню в доках по mysql есть раздел где описываются алгоритмы, для лучшего понимания. Возможно и в PHP есть подобное, если достаточно глубоко копнуть:) | |
|
|
|
|
|
|
|
для: Loki
(17.02.2009 в 22:11)
| | Было бы интересно взглянуть. Я не видел. | |
|
|
|
|
|
|
|
для: 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;
|
| |
|
|
|
|
|
|
|
для: STEVER
(10.02.2009 в 22:38)
| | PHP в основе имеет СИ, и открывая файл эксклюзивно (открывая, а неоябязательно считывая, это разные вещи), вы не сможете более открыть это файл еще раз. Т.е. если указатель на файл уже инициализирован, то будет использоваться он, а не инициализироваться другой. | |
|
|
|