A. What does this do?
require ("./file.php");
B. in comparison to this?
require ("file.php");
(Its not up-one-directory.. which would be)
require ("../file.php");
A. What does this do?
require ("./file.php");
B. in comparison to this?
require ("file.php");
(Its not up-one-directory.. which would be)
require ("../file.php");
There's a difference I noticed today.
Let's say you include a file in
index.php
.tldr aclaration: it's slighly faster to use "
./
" because it wouldn't search in other folders first..But now lets say I want to include the file
inc/functions.php
.Because I will include this functions in every place I have the "head", I would directly include that file within
inc/head.php
.The problem is, since the file where the script began is actually
index.php
and NOTinc/head.php
, this script will fail because it would try to look for a file that doesn't exist: a file namedfunctions.php
in the same directory asindex.php
.So, instead of using the "./" sintax, we have two options:
include "./inc/functions.php";
include "functions.php"
So in this particular case, having or not a "
./
" actually is important, since it considerably changes how the script behaves.Hope this was clarifying.
TLDR; Using "./" will always be relative to the file where the execution initialices, while using nothing ("") will be relative to the include_path, and after that, relative to the directory of the current file
./
is the current directory. It is largely the same as justfile.php
, but in many cases (this one included) it doesn't check any standard places PHP might look for a file, instead checking only the current directory.From the PHP documentation (notice the last sentence):
The Short Answer
You're right, it's not up one directory. A . refers to the directory you're in, and .. refers to the parent directory.
Meaning, ./file.php and file.php are functionally equivalent in PHP. Here's the relevent page of documentation: http://us.php.net/manual/en/wrappers.file.php
The Longer Answer
However, just because they work the same in this context doesn't mean they're always the same.
When you're operating in a *nix shell environment, and you type the name of an executable file, the shell will look in the PATH directories, but it won't look in the CWD, or the directory you're currently in.
So, if you're in a directory that has a file called: myprogram.php (this would be a PHP CLI file) and you just type:
myprogram.php
it doesn't matter if your program is executable or not. The shell will look in /bin/, /usr/bin/ etc for your file, but it won't look in ./, or the directory you're in.
To execute that program without adding your directory to the PATH, you need to type
./myprogram
So really, ./ is more explicit. It means, "the file you're looking for HAS to be right here" and no ./ means, "the file should be somewhere the program looking for files".
The dot-slash forces the file to be found in the current directory only, rather than additionally searching the paths mentioned in the include_path setting.
Simply you are telling php to include the file in the current directory only or fail if the file is not present.
If you use the format "indexcommon3.php" and the file is not present php will search it into the include_path system variable.
For reference you can use http://www.php.net/manual/en/function.include.php
The first version forces the internal mechanism to include files relatively to the... directly executed file. So for example you have
index.php
second.php
third.php