What does the dot-slash do to PHP include calls?

The first version forces the internal mechanism to include files relatively to the... directly executed file. So for example you have

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

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 relavent 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 ./: 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 lack of ./ means, "the file should be somewhere the program is looking for files".


./ is the current directory. It is largely the same as just file.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):

Files for including are first looked for in each include_path entry relative to the current working directory, and then in the directory of current script. E.g. if your include_path is libraries, current working directory is /www/, you included include/a.php and there is include "b.php" in that file, b.php is first looked in /www/libraries/ and then in /www/include/. If filename begins with ./ or ../, it is looked only in the current working directory.