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

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

require ("./file.php");

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

require ("file.php");

(Это не верхний каталог .. который был бы)

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

Ответов (7)

Решение

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

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

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

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

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

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


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

TL; DR; Всегда используйте ./ или, __DIR__ потому что он относится к рабочему каталогу и не зависит от "пути включения" php.

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

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

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

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

Вы правы, это не один каталог. А. относится к каталогу, в котором вы находитесь, а .. относится к родительскому каталогу.

Это означает, что ./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

Так что на самом деле ./ более явный. Это означает, что «файл, который вы ищете, ДОЛЖЕН находиться прямо здесь», а no ./ означает, что «файл должен быть где-то в программе, которая ищет файлы».

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

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