Что делает точка-косая черта с PHP, включает вызовы? - PullRequest
39 голосов
/ 24 февраля 2009

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

require ("./file.php");

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

require ("file.php");

(это не up-one-directory .. что будет)

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

Ответы [ 7 ]

47 голосов
/ 24 февраля 2009

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

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

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

8 голосов
/ 24 февраля 2009

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

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";
6 голосов
/ 24 февраля 2009

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

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

Значение ./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 / etc, но не будет искать ./ или каталог, в котором вы находитесь.

Чтобы выполнить эту программу без добавления вашего каталога в PATH, вам нужно набрать

./myprogram

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

5 голосов
/ 24 февраля 2009

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

4 голосов
/ 24 февраля 2009

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

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

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

0 голосов
/ 05 июня 2018

Сегодня я заметил разницу.

Допустим, вы включили файл в index.php.

<?php
include "./inc/head.php";
// right now, with the current code, this would work as well:
// include "inc/head.php";

tldr aclaration : использовать "./" немного быстрее, потому что он не будет сначала искать в других папках ..

Но теперь допустим, я хочу включить файл inc/functions.php.

Поскольку я буду включать эти функции в каждом месте, где у меня есть «голова», я бы напрямую включил этот файл в inc/head.php.

<?php
// Wouldn't it be logical here to do this?
include "./functions.php";

Проблема в том, что файл, с которого был запущен скрипт, на самом деле index.php, а НЕ inc/head.php, этот скрипт не удастся , потому что попытается найти файл, который не существует: файл с именем functions.php в том же каталоге , что и index.php.

[+] inc/
  \_ [.] functions.php <- We want to include this...
   _ [.] head.php      <- ...from this file
[.] index.php
 x  functions.php <-- Not this! (doesn't exist)

Итак, вместо использования синтаксиса "./" у нас есть два варианта:

  • Включите файл, используя этот код: include "./inc/functions.php";
  • Включите файл, используя этот код: include "functions.php"

Так что в данном конкретном случае наличие или отсутствие "./" на самом деле * важно , поскольку оно значительно меняет поведение сценария.

Надеюсь, это прояснилось.

TLDR; Использование «./» всегда будет относиться к файлу, в котором инициализируется выполнение, а использование ничего («») будет относиться к include_path, а после этого - к каталогу текущего файла

0 голосов
/ 24 февраля 2009

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

...