All my PHP include files are in a single directory:
<?php include 'includes/logo.php'; ?>
<?php include 'includes/main_nav.php'; ?>
<?php include 'includes/news.php'; ?>
<?php include '../includes/logo.php'; ?>
<?php include '../includes/main_nav.php'; ?>
<?php include '../includes/news.php'; ?>
<?php include '../../includes/logo.php'; ?>
<?php include '../../includes/main_nav.php'; ?>
<?php include '../../includes/news.php'; ?>
$base = "https://www.mywebsite.com/includes";
<?php include $base . "logo.php" ?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/logo.php" ?>
I would advise against using anything that needs something outside of PHP, like the $_SERVER variable.
$_SERVER['DOCUMENT_ROOT'] is usually set by the webserver, which makes it unusable for scripts running from the command line. So don't use this.
Also don't use url's. The path-part in a url is not the same as the path of the file on disk. In fact, that path can not even exist on disk (think Apache rewrites).
Including url's also needs you to turn
allow_url_include on, which introduces (severe) security risks if used improperly.
If your minimal supported PHP version is 5.3 (I hope it is!), you can use the magic constant
__DIR__. 2 examples:
define(ROOT_DIR, __DIR__); define(ROOT_DIR, realpath(__DIR__ . '/..'));
If you need to support lower versions, use
dirname(__FILE__). 2 examples:
define(ROOT_DIR, dirname(__FILE__)); define(ROOT_DIR, realpath(dirname(__FILE__) . '/..'));
ROOT_DIR points to the root of you project, not some subdirectory inside it.
You can then safely use
ROOT_DIR to include other files:
include ROOT_DIR . '/some/other/file.php';
Note that I'm defining a constant (
ROOT_DIR), not a variable. Variables can change, but the root directory of you project doesn't, so a constant fits better.
realpath() will resolve any relative parts and symlinks to the canonicalized absolute pathname.
So given the following files and symlink:
/path/to/some/file.php /path/to/another/file.php /path/to/symlink => /path/to/another
define(ROOT_DIR, realpath(__DIR__ . '/../symlink'));
ROOT_DIR would become
/path/to/some(so we get
..is 1 directory up (so we get
You don't really need to use
realpath(), but it does tidy up the path if you're relying on relative parts or symlinks. It's also easier to debug.
If you need to include files that contain classes, you'd best use autoloading. That way you won't need
include statements at all.
Use a framework
One last pease of advise: This problem has been solved many many times over. I suggest you go look into a framework like Symfony, Zend Framework, Laravel, etc. If you don't want a "full stack" solution, look into micro-frameworks like Silex, Slim, Lumen, etc.