I ran into an interesting problem with the PHP include
mechanism last night (specifically, with the require_once
variant, but this discussion applies to all of the include
-style functions). Suppose I have the following folder structure in my web application:
myapp/
|-- includes.php
+-- admin/
|-- admin_includes.php
+-- ajax/
+-- my_ajax.php
Let's take a look at the individual PHP files in reverse order. These examples are bare bones, but will illustrate the problem. First, my_ajax.php:
// my_ajax.php
<?php
require_once("../admin_includes.php");
some_generic_function();
?>
Here's the code for admin_includes.php:
// admin_includes.php
<?php
require_once("../includes.php");
?>
And finally, includes.php:
// includes.php
<?php
function some_generic_function()
{
// Do something here
}
?>
When I go to access the my_ajax.php file, I'll get a "no such file or directory" PHP error. This immediately doesn't make much sense, but a quick glance at the PHP manual clears things up:
Files for including are first looked for in each include_path entry relative to the current working directory, and then in the directory of the current script. If the file name begins with ./ or ../, it is looked for only in the current working directory.
The important part is in that last sentence: if your include
or require
statement starts with a ./ or ../, PHP will only look in the current working directory. So, in our example above, our working directory when accessing the AJAX script is "/myapp/admin/ajax." The require_once
within the admin_functions.php file will therefore fail, since there's no '../includes.php' in the current working directory.
This is surprising behavior and should be kept in mind when chaining includes. A simple workaround is to use the following code in your include statements:
require_once(dirname(__FILE__) . "../../some/relative/path.php");
It's not the most elegant solution in the world, but it gets around this PHP annoyance.