La technique du dirname(FILE)

/**
 * Exemples:
 *
 * /home/moi-meme/public_html/index.php => /home/moi-meme/public_html
 * c:\public_html\index.php => c:\public_html
 */
$cwd = dirname(__FILE__);

Si vous voulez le chemin réel sur la machine (enlever les lien symboliques et les ../), vous pouvez aussi faire :

/**
 * Exemples:
 *
 * /home/moi-meme/public_html/index.php => /var/users/moi-meme/public_html (avec lien symbolique de /home vers /var/users)
 * c:\public_html\index.php => c:/public_html
 */
$cwd = realpath(dirname(__FILE__));

Pour obtenir un chemin normalisé avec des / au lieu de \ sur windows (utile pour le cross plateforme windows/linux ou pour la comparaison de sous-chaîne sans se soucier de la plateforme) :

/**
 * Exemples:
 *
 * /home/moi-meme/public_html/index.php => /home/moi-meme/public_html
 * c:\public_html\index.php => c:/public_html
 */
$cwd = str_replace(DIRECTORY_SEPARATOR,'/',realpath(dirname(__FILE__)));

La technique du dirname(FILE).'/../'

Comme lorsque vous êtes dans un fichier vous savez où il se trouve relativement par rapport aux autres (par exemple mon fichier ./includes/functions.php, je sais qu'il est dans le sous-répertoire includes à partir de la racine de mon application), vous pouvez ensuite vous servir de se "positionnement" relatif pour include des fichiers :

Dans le fichier ./includes/all.php

require_once dirname(__FILE__).'/functions/database.php';

...

Imaginez que vous ayiez un répertoire ./html/ qui contient index.php et un répertoire ./includes/ qui contient le fichier functions.php (de sorte que le fichier functions.php ne soit pas directement accessible dans l'arborescence du serveur web qui pointe sur ./html) .
Vous pouvez donc include le fichier functions.php de la manière suivante dans le fichier index.php :

require_once dirname(__FILE__).'/../includes/functions.php';

...

même si vous déplacez votre application dans un autre répertoire du système ou sur un autre serveur, tant que l'arborescence des fichiers de votre application ne change pas, il n'y a aucun impact sur votre code source !
Plus besoin de tenir (pour ceux qui n'utilisaient pas déjà cette technique) un fichier de configuration avec des define qui est a modifié à chaque installation.

Et vous comment gérez vous les chemins absolus (inclusions de fichiers ou lecture de fichier sur le disque) dans vos applications ?