А. Что это делает?
require ("./file.php");
Б. по сравнению с этим?
require ("file.php");
(Это не вверх-один-каталог... что было бы)
require ("../file.php");
А. Что это делает?
require ("./file.php");
Б. по сравнению с этим?
require ("file.php");
(Это не вверх-один-каталог... что было бы)
require ("../file.php");
./ — это текущий каталог. Во многом это то же самое, что и просто file.php, но во многих случаях (в том числе и в этом) он не проверяет какие-либо стандартные места, где PHP может искать файл, вместо этого проверяет только текущий каталог.
Из документации по PHP (обратите внимание на последнее предложение):
Файлы для включения сначала ищутся в каждой записи include_path относительно текущего рабочего каталога, а затем в каталоге текущего скрипта. Например. если ваш include_path — это библиотеки, текущий рабочий каталог — /www/, вы включили include/a.php и в этом файле есть include «b.php», b.php сначала просматривается в /www/libraries/, а затем в / www/включить/. Если имя файла начинается с ./ или ../, он просматривается только в текущем рабочем каталоге.
Первая версия заставляет внутренний механизм включать файлы относительно... непосредственно исполняемого файла. Так, например, у вас есть
index.php
// directly executed script (php -f index.php or from a browser)
include 'second.php';
второй.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';
третий.php
// This is included relatively to second.php ONLY. It does not search
// include_path
return "foo";
third.php комментарии на самом деле неправильно. third.php на самом деле включен только относительно index.php. На самом деле даже это неправильно. На самом деле он включается только относительно текущего рабочего каталога. Например, если index.php находится в /var/www/index.php. И вы переходите в другой каталог (например, cd /var), а затем пытаетесь выполнить index.php с помощью php www/index.php, ТОГДА, когда вы делаете include './third.php', php попытается найти его в каталоге /var и потерпит неудачу, если его там нет
- person Arthur Shveida; 14.07.2020
Короткий ответ
Вы правы, это не один каталог. А . относится к каталогу, в котором вы находитесь, а .. относится к родительскому каталогу.
Это означает, что ./file.php и file.php функционально эквивалентны в PHP. Вот соответствующая страница документации: http://us.php.net/manual/en/wrappers.file.php
Длинный ответ
Однако то, что они работают одинаково в этом контексте, не означает, что они всегда одинаковы.
Когда вы работаете в среде оболочки *nix и вводите имя исполняемого файла, оболочка будет искать в каталогах PATH, но не будет искать в CWD или в каталоге, в котором вы сейчас находитесь.
Итак, если вы находитесь в каталоге, в котором есть файл с именем: myprogram.php (это будет файл PHP CLI), и вы просто набираете:
myprogram.php
не имеет значения, является ли ваша программа исполняемой или нет. Оболочка будет искать ваш файл в /bin/, /usr/bin/ и т. д., но не будет искать в ./ или в каталоге, в котором вы находитесь.
Чтобы выполнить эту программу без добавления вашего каталога в 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.
Вместо этого мы должны использовать синтаксис ./ для включения внутреннего-внутреннего. Это будет означать, что включаемый файл должен быть включен относительно текущего файла, а не текущей «точки входа» 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.
Он явно называет текущий каталог.