Что делает точка-косая черта для PHP, включая вызовы?

а. Что это делает?

require ("./file.php");

В. по сравнению с этим?

require ("file.php");

( не up-one-directory.., который будет)

require ("../file.php");

Ответ 1

./ - текущий каталог. Это во многом то же самое, что только file.php, но во многих случаях (включая этот) он не проверяет какие-либо стандартные места PHP может искать файл, вместо этого проверяя только текущий каталог.

Из документации PHP (обратите внимание на последнее предложение):

Файлы для включения сначала ищутся в каждой записи include_path относительно текущего рабочего каталога, а затем в каталоге текущего script. Например. если ваш include_path - это библиотеки, текущий рабочий каталог -/www/, вы включили include/a.php, и в этом файле есть "b.php", b.php сначала просматривается в /www/libraries/, а затем в/WWW/включить/. Если имя файла начинается с./или../, оно отображается только в текущем рабочем каталоге.

Ответ 2

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

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";

Ответ 3

Короткий ответ

Вы правы, это не один каталог. 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

Так действительно,./более явным. Это означает, что "файл, который вы ищете, должен быть здесь", и нет./означает, что "файл должен быть где-то в программе, ищущей файлы".

Ответ 4

Точечная косая черта заставляет файл искать только в текущем каталоге, а не дополнительно искать пути, указанные в параметре include_path.

Ответ 5

Просто вы говорите, что php должен включать файл в текущий каталог только или сбой, если файл отсутствует.

Если вы используете формат "indexcommon3.php", а файл отсутствует, php будет искать его в системной переменной include_path.

Для справки вы можете использовать http://www.php.net/manual/en/function.include.php

Ответ 6

Изменить: я полностью переписал ответ для ясности


При включении файла вы можете использовать ./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".

Ответ 7

Он явно называет текущий каталог.