Skip to content
Advertisement

PHP directory separators, forcing forward slash; non-intrusive

Whenever I work with PHP (often) I typically work on a Windows box, however I (try to) develop platform agnostic applications; one major point of issue being the use of directory separators.

As many know, doing any filesystem work in a Windows environment in PHP, you can use forward slashes in lieu of backwards, and PHP sorts it out under the hood. This is all fine when it comes to using string literals to pass a path to fopen() or whatever; but when retrieving paths, be it __FILE__ or expanding with realpath(), the paths retrieved are of course using the OS appropriate slashes. Also, I’ve noticed some inconsistencies in trailing slashes. Once or twice __DIR__ has appended one (a backslash) and realpath() too (I prefer the trailing slash, but not intermittently)

This is clearly a problem for string comparison, because instead of doing:

compare_somehow('path/to/file.php', __DIR__);

For the sake of reliability, I’m having to go:

compare_somehow('path/to/file.php', rtrim(strtr(__DIR__, '\', '/'), '/') . '/');

This seems like alot of work. I can drop it into a function, sure; now I’m stuck with an arbitrary function dependency in all my OO code.

I understand that PHP isn’t perfect, and accommodations need to be made, but surely there must exist some platform agnostic workaround to force filesystem hits to retrieve forward slashed paths, or at least a non-intrusive way to introduce a class-independent function for this purpose.

Summary question(s):

  • Is there some magical (though reliable) workaround, hack, or otherwise to force PHP to kick back forward slashed filesystem paths, regardless of the server OS?
  • I’m going to assume the answer is no to the above, so moving on; what provisions can I make to enforce forward slash (or whatever choice, really) as the directory separator? I’m assuming through the aforementioned filter function, but now where should it go?

Forward slash for everything. Even if the host OS separator is #*&@.

Advertisement

Answer

As I commented I can’t really see why you would have to do this (I’d be interested in a quick description of the specific problem you are solving), but here is a possible solution using the output of __FILE__ as an example:-

$path = str_replace('\', '/', __FILE__);

See it working

This will(should?) work regardless of the *slashes returned by the OS (I think).

Unfortunately I’m not aware of “some magical (though reliable) workaround, hack, or otherwise to force PHP to kick back forward slashed filesystem paths, regardless of the server OS” other than this. I imagine it could be wrapped in a helper class, but that still gives you an arbitary dependancy in your code.

User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement