Отправляет email-рассылки с помощью сервиса Sendsay

[TC] сайтостроителям

Друзья, Объясните мне ради христа, чем отличаются четыре выражения на php:
include (), require(), include)_once() и require_once(). Как не искал, таки
не смог найти, а здесь, сколько я помню, есть хорошие специалисты по этим
вопросам.

Эдик. Новокузнецк.
winks***@r*****.ru

Ответить   Sat, 31 Mar 2007 16:03:10 +0800 (#652312)

 

Ответы:

Приветствую!

Эдуард пишет:

Include может выполняться условно.
if(a==b)
{
include('file.php');
}

Операторные скобки обязательны, если даже строчка всего одна.

require выполняется всегда.

Аналоги функций с окончанием once включают файл только если он не был
включён ранее.

Ответить   Sat, 31 Mar 2007 13:07:57 +0400 (#652318)

 

Здравствуйте, Эдуард.

-----------------------*- Original Message -*Э> Друзья, Объясните мне ради христа, чем отличаются четыре выражения на php:

"require" - выполняется при запуске скрипта, а "include" - при
исполнении скрипта.
Другими словами, если вы написали "require", то текст из
подцепляемого файла будет вставлен в скрипт в самом начале при его,
скрипта, запуске. А если напишете "include", то текст будет подставлен в
тот момент, когда интерпритатор доберется до этой команды.

"once" означает, что интерпритатор проверит, чтобы вставляемый
файл вставился только один раз.
Ну, скажем, в какой-то вашей библиотеке вы подключаете файл
"pomidor.inc". А потом в скрипте подключаете библиотеку и в этом же
скрипте хотите подключить файл "pomidor.inc". Если написать
require "pomidor.inc";
то содержимое файла pomidor.inc будет вставлено в скрипт дважды: один
раз командой из библиотеки, а другой раз командой из скрипта. А если
написать
require_once "pomidor.inc";
то интерпритатор поймет, что вы, на самом деле, не хотите вставлять
содержимое этого файла дважды и второй раз файл подцеплен не будет.

Ответить   Vladimir Dovydenkov Sat, 31 Mar 2007 13:30:55 +0400 (#652330)

 

Suilad, Vladimir!

А разве круглые скобки не нужны?
И попутно вопрос: а что такое .inc? Видел много раз, но что это, не
знаю...

Ответить   Anarendil Sat, 31 Mar 2007 16:08:24 +0400 (#652367)

 

Здравствуйте, Владимир.

Другими словами, если вы написали "require", то текст из подцепляемого файла
будет вставлен в скрипт в самом начале при его, скрипта, запуске. А если
напишете "include", то текст будет подставлен в тот момент, когда
интерпритатор доберется до этой команды.

Спасибо. А значит ли это что в скрипт можно включать результат выполнения
других скриптов с другого сервера с параметрами? Ну например:
include (http://garant.ru/news/news.php?id=1862439");
Допустима такая конструкция?

Эдик. Новокузнецк.
winks***@r*****.ru

Ответить   Sun, 1 Apr 2007 00:09:18 +0800 (#652418)

 

Здравствуйте уважаемые участники дискуссии и эдик!
Извините, что встрял. А с помощью какой программы вы разрабатываете php скрипты?
Я вчера скачал на freesoft PHP Expert Editor 4.1,
А прога не хочет джозится.
С уважением, Иван Денишев.

Ответить   Sat, 31 Mar 2007 20:34:56 +0400 (#652485)

 

Здравствуйте, Иван. Да! ExpertEditor джозится отвратительно. Я обкатываю код
на Дэнвере
http://denwer.ru
Посмотрите. Штука очень хорошая!
Будьте осторожны, инсталлятор там реализован как .bat-файл, т.е. джозом не
озвучивается. Проще всего извлечь пакет архиватором и устанавливать его
вручную. Практически со всеми операционками, кроме windows95 проблем не
бывает.
Будут проблемы, пишите.

Эдик. Новокузнецк.
winks***@r*****.ru

Ответить   Sun, 1 Apr 2007 08:15:20 +0800 (#652500)

 

Suilad, Иван!

Иван, вы не поверите! _Разрабатываем_ (по крайней мере, я) с
помощью... обычного блокнота))))). А вот тестировать на своём компе,
это да, Денвер в помощь!

Ответить   Anarendil Sun, 1 Apr 2007 12:40:21 +0400 (#652554)

 

Здравствуйте, сайтоделы и остальные участники дискуссий.
Serg пишет:

Ошибочка вышла. Обращаемся к документации, например, к php 4, как самому распространенному
интерпретатору php на хостах и узнаем,
что операторы include и require отличаются только способом обработки исключений,
то есть ситуации отсутствия подключаемого файла.
Для include это будет предупреждение (warning) и интерпретатор продолжит исполнение
скрипта, а для require это будет fatal error.
Никаких других отличий между этими операторами нет. Так что следующий код:
<?php
if (true) {
include ('inc.txt');
} else {
require ('req.txt');
}

Подключит только файл "inc.txt".

Владимир пишет:
"require" - выполняется при запуске скрипта, а "include" - при

Это тоже неверно. Следующий код будет выполнен интерпретатором до того места,
где встречается неисполнимый оператор require, то
есть ровно так же, как если бы в этом месте был оператор include (за исключением
обработки возникшей ошибки).
<?php
// чтобы не слетала кодировка в IE
header ('Content-Type: text/html;charset=windows-1251');
echo '<H1>День смеха 1 апреля!</H1>';
echo '<P>В следующей строке будет выполнен оператор require, который пытается
подключить несуществующий файл, что приводит к
неустранимой ошибке, однако этот текст будет отображен на странице.</P>';
require ('hoho.txt');

Эдуард пишет:

Все-таки я рекомендовал бы читать мануалы к соответствующим версиям php.

Нет, из тех ответов, которые вам дали, это не следует. Однако это возможно.

Да. Только перед include рекомендуется поставить символ @, чтобы подавить предупреждение
интерпретатора в случае отсутствия
подключаемой страницы.

Успехов. Анатолий.

Ответить   "i_chay" Sun, 1 Apr 2007 10:15:04 +0500 (#652519)

 

Suilad, i_chay!

Анатолий, простите, а где их взять?..

И ещё. Что за символ @ (в смысле, где он употребляется в PHP кроме
приведённого вами случая)?

Ответить   Anarendil Sun, 1 Apr 2007 12:37:06 +0400 (#652552)

 

Здравствуйте, Андрей.

Их взять тут:
http://www.php.net/download-docs.php

в т.ч. в формате .chm, в т.ч. на русском (может быть, интересно для других подписчиков).

Существуют, как минимум, два стандартных потока вывода: обычный (в него выводит
информацию, например, функция print) и поток для
сообщений об ошибках, в который выводят информацию все функции, если в их работе
происходит ошибка. По умолчанию оба эти потока
"сливаются" в окно браузера. Если нужно, чтобы клиент не получал сообщений об
ошибках, то можно либо перенаправить поток с
сообщениями об ошибках, либо подавить вывод такого сообщения у отдельно взятой
функции в конкретном скрипте.
Символ @, помещенный непосредственно перед именем вызываемой функции, подавляет
вывод сообщений об ошибках.

Успехов. Анатолий.

Ответить   "i_chay" Sun, 1 Apr 2007 14:44:38 +0500 (#652570)

 

Здравствуйте, Анатолий!
А как перенаправить поток сообщений об ошибках в файл, например,
errors.log?
Спасибо!

Ответить   Anarendil Sun, 1 Apr 2007 14:49:06 +0400 (#652585)

 

Здравствуйте, Андрей.

Файл для вывода сообщений об ошибках назначается опцией
error_log="filename"
в конфигурационном файле php.ini. По умолчанию этот параметр закомментирован.

Запись ошибок в лог ошибок сервера включается/выключается опцией
log_errors = On|Off
По умолчанию эта опция включена и ошибки php пишутся в общий лог ошибок http-сервера.

Если вам нужно, чтобы при этом сообщения об ошибках не выводились в браузер,
то установите в настройках php опцию
display_errors = Off

Если у вас нет доступа к файлу php.ini, но есть возможность использовать файлы
.htaccess, то эти опции можно установить в файле
.htaccess, который следует поместить в DOCUMENT_ROOT вашего сайта:
# каждая опция занимает одну строку, то есть
# ниже идут
#две опции -- две строки
php_value error_log "filename"
php_flag display_errors off

Подробнее см. в руководстве главу, посвященную конфигурированию php.
Если в этом случае сервер выдает ошибку 500, то, скорее всего, ваш php не является
модулем сервера (апача). В этом случае вам
нужно согласовать с вашим хостером размещение файла php.ini с настройками для
вашего сайта. Вы можете столкнуться с этой ситуацией
отлаживая, скажем, скрипт под Windows, тогда как на сервере хостера такая ошибка
возникать не будет.

Если вы хотите изменить обработку ошибок внутри скрипта, то вам следует изучить
функции:
error_reporting(),
set_error_handler(),
restore_error_handler(),(),
error_log(),()

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

Успехов. Анатолий.

Ответить   "i_chay" Sun, 1 Apr 2007 19:44:56 +0500 (#652637)

 

Приветствую!

i_chay пишет:

Вы правы. Моя информация устарела.
Кстати, с версии 4, для обеих конструкций, работает подключение по условию.

Ответить   Sun, 01 Apr 2007 16:21:04 +0400 (#652606)

 

Здравствуйте, Эдуард.

-----------------------*- Original Message -*Э> А значит ли это что в скрипт можно включать результат выполнения

Думаю нет, т.к. "include" подцепляет локальный файл.

В вашем случае можно воспользоваться другой командой. Я точно не
помню, поищите в справочниках. Кажется, она называется Get_File_contents
или что-то в этом духе.

Ответить   Vladimir Dovydenkov Sun, 01 Apr 2007 12:34:56 +0400 (#652551)

 

Здравствуйте, Владимир.

Это не совсем так. Поведение функций, для которых в качестве одного из параметров
передается имя файла, определяется директивой
allow_url_fopen
в конфигурационном файле php. По умолчанию имя файла может быть задано как url
и для большинства функций это будет корректный
параметр. В некоторых версиях php для Windows include не могут подхватывать ссылки,
но вряд ли у вас стоит такой устаревший
вариант.
Разумеется, что хостер может отключить эту опцию.

Успехов. Анатолий.

Ответить   "i_chay" Sun, 1 Apr 2007 19:46:12 +0500 (#652638)

 

Приветствую!

i_chay пишет:

url

ссылки,

Это версии php до 4.3.0. Так как denver обновляют не часто, может версия
и ниже. Проверьте свою.

Вообще же, если нужно получить информацию для обработки и использования,
а не скрипт для выполнения, лучше пользоваться функциями для работы с
файлами вроде fopen.
Жаль, что нельзя отключить возможность работы с удалёнными файлами
только у функции include и require. Иначе стоило бы это сделать.
Существенная часть уязвимостей основана на недостаточном контроле имён
подключаемых файлов (так называемый инклюдинг) и, если возможен
удалённый инклюдинг, это самая критическая уязвимость получается.

Ответить   Sun, 01 Apr 2007 20:00:09 +0400 (#652662)