а. Что это делает?
require ("./file.php");
В. по сравнению с этим?
require ("file.php");
( не up-one-directory.., который будет)
require ("../file.php");
а. Что это делает?
require ("./file.php");
В. по сравнению с этим?
require ("file.php");
( не up-one-directory.., который будет)
require ("../file.php");
./
- текущий каталог. Это во многом то же самое, что только file.php
, но во многих случаях (включая этот) он не проверяет какие-либо стандартные места PHP может искать файл, вместо этого проверяя только текущий каталог.
Из документации PHP (обратите внимание на последнее предложение):
Файлы для включения сначала ищутся в каждой записи include_path относительно текущего рабочего каталога, а затем в каталоге текущего script. Например. если ваш include_path - это библиотеки, текущий рабочий каталог -/www/, вы включили include/a.php, и в этом файле есть "b.php", b.php сначала просматривается в /www/libraries/, а затем в/WWW/включить/. Если имя файла начинается с./или../, оно отображается только в текущем рабочем каталоге.
Первая версия заставляет внутренний механизм включать файлы относительно... непосредственно исполняемого файла. Так, например, у вас есть
index.php
// directly executed script (php -f index.php or from a browser)
include 'second.php';
second.php
// This is included relatively to index.php
// Actually, it is first searched relatively to include_path, then relatively
// to index.php
include './third.php';
third.php
// This is included relatively to second.php ONLY. It does not search
// include_path
return "foo";
Короткий ответ
Вы правы, это не один каталог. A. ссылается на каталог, в котором вы находитесь, и.. ссылается на родительский каталог.
Значение,./file.php и file.php функционально эквивалентны в PHP. Здесь уместная страница документации: http://us.php.net/manual/en/wrappers.file.php
Более длинный ответ
Однако только потому, что они работают одинаково в этом контексте, это не значит, что они всегда одинаковы.
Когда вы работаете в среде оболочки * nix и вводите имя исполняемого файла, оболочка будет выглядеть в каталогах PATH, но она не будет выглядеть в CWD или в каталоге, который вы используете в настоящее время.
Итак, если вы находитесь в каталоге с файлом с именем: myprogram.php(это будет файл CLI для PHP), и вы просто наберете:
myprogram.php
Не имеет значения, является ли ваша программа исполняемой или нет. Оболочка будет выглядеть в /bin/,/usr/bin/etc для вашего файла, но она не будет выглядеть./или каталог, в котором вы находитесь.
Чтобы выполнить эту программу без добавления вашего каталога в PATH, вам нужно ввести
./myprogram
Так действительно,./более явным. Это означает, что "файл, который вы ищете, должен быть здесь", и нет./означает, что "файл должен быть где-то в программе, ищущей файлы".
Точечная косая черта заставляет файл искать только в текущем каталоге, а не дополнительно искать пути, указанные в параметре include_path.
Просто вы говорите, что php должен включать файл в текущий каталог только или сбой, если файл отсутствует.
Если вы используете формат "indexcommon3.php", а файл отсутствует, php будет искать его в системной переменной include_path.
Для справки вы можете использовать http://www.php.net/manual/en/function.include.php
Изменить: я полностью переписал ответ для ясности
При включении файла вы можете использовать ./myfile.php
или myfile.php
.
Они не одинаковы, и вы всегда должны предпочтительно использовать первый синтаксис, если только вы не знаете, что делаете.
Разницу лучше всего проиллюстрировать на примере: допустим, у вас есть следующие файлы и структура папок:
index.php
inc/inner.php
Из index.php вы можете включить свой внутренний шаблон без символа "./", и он будет работать как положено:
# index.php
<?php
include "inc/inner.php";
Теперь допустим, что мы добавляем новый файл, поэтому структура папок теперь выглядит следующим образом:
index.php
inc/inner.php
inc/inner-inner.php
Чтобы включить inner-inner.php
в inner.php
, мы сделаем это... правильно?
# src/inner.php
<?php
include "inner-inner.php";
Неправильный. index.php
просто ищет inner-inner.php
* в корневой папке '.
index.php
inc/inner.php
inc/inner-inner.php
* inner-inner.php <- Doesn't exist, PHP ERROR.
Вместо этого мы должны использовать синтаксис ./
для включения inner-inner. Это будет указывать, что файл, который мы включаем, должен быть включен относительно текущего файла, а не в текущую "точку входа" PHP-скрипта.
# src/inner.php
<?php
include "./inner-inner.php";
Кроме того, как упоминалось в других комментариях, если вы настроили другой "путь загрузки" для своего PHP-приложения, этот путь загрузки будет сначала найден без синтаксиса ./
. Вместо этого синтаксис ./
более эффективен, поскольку он не проверяет "путь включения" в php.
Если вы хотите сделать ваши включения еще более явными, используйте константу __DIR__
. Это говорит php: "Распечатать текущий каталог, в котором находится этот файл".
# src/inner.php
<?php
include __DIR__ . "/inner-inner.php";
TLDR; Всегда используйте ./
или __DIR__
, потому что он относится к рабочему каталогу и не зависит от php "include path".
Он явно называет текущий каталог.