views:

440

answers:

3

Is this the proper way to define an include path for both *nix and Windows?

define( 'INCPATH', realpath( dirname( __FILE__ ) ) . '/' );

Note the trailing forward-slash I included above. Is the forward-slash for includes/requires the same for both OS's, as well?

EDIT (UPDATED WITH ANSWER):

From what I can gather, my code below is the proper way to universally define an include/require path for both *nix and Windows OS's. Feel free to correct anything in the comments below.

The thing that confused me were the many examples I saw showing replacement of back-slashes (\) into forward-slashes(/). Based on some of the answers below, this is unnecessary.

So the final correct code (for the purist) is:

define( 'INCPATH', realpath( dirname( __FILE__ ) ) . DIRECTORY_SEPARATOR );

That code produces the following results:

*nix: /path/to/the/file/

Windows: C:\Path To\the\file\

An brief explanation, working our way from the inside (__FILE__) out (realpath()):

__FILE__ The full path and filename of the file. Always contains an absolute path with symlinks resolved.

dirname() The returned string is path with any trailing /component removed. Responsible for removing the filename.

realpath() Returns the canonicalized (normalized/standardized) absolute pathname on success. The resulting path will have no symbolic link, '/./' or '/../' components. I assume this is included for thoroughness because __FILE__ already resolves symlinks. Or maybe it's included to resolve relative paths? Either way, it seems to solidify our goal.

+3  A: 

Forward slashes will work for both OS's, and it's the way to go.

I couldn't find an absolute reference to this, but it's indicated in several places in the PHP manual, like here and here. And, it works for me, a Windows & Linux user.

Lastly, you may end up specifying mixed-paths on Windows, like c:\\apache\\htdocs\\myapp/index.php, and that all works fine.

Derek Illchuk
@Derek, good info - thanks. I will assume my definition above works on both OS's.
Jeff
I often wonder why backslashes are still used, since it causes escape headaches and forward slash would work just as well.
Ether
A: 

To many people's surprise, / works fine on Windows—and MSDOS. Within pathnames, it works even on OpenVMS.

However, if you are doing something within PHP for paths, an array would be a more convenient structure than a string.

$MYPATH = array ('.', '/usr/lib/', '/usr/share/lib');
wallyk
+2  A: 

Alternatively you can use PHP's predefined constant DIRECTORY_SEPARATOR, which will give you the OS-specific directory delimiter. See http://www.php.net/manual/en/dir.constants.php also.

fireeyedboy