DIRECTORY_SEPARATOR и PATH_SEPARATOR
В php есть замечательные предопределенные константы - DIRECTORY_SEPARATOR и PATH_SEPARATOR. Нужны они для того, чтобы скрыть различия в путях между линуксом и виндой. И хоть эти вещи для многих очевидны - всегда найдется парень, который про это не в курсе и натворит бед. Так вот, чтобы отделять директории, нужно юзать DIRECTORY_SEPARATOR - ну, например 'images' . DIRECTORY_SEPARATOR . 'upload' . Да-да, я знаю, все и так используют символ '/' для разделения путей, потому что это работает и в винде, где он не родной, и в линухе. Можно сказать, что константа DIRECTORY_SEPARATOR в принципе нафиг не нужна, если юзать '/' вместо '\' , но это правильно и создает уверенность что все будет зашибись, где бы это не запустилось.
А вот про вторую константу PATH_SEPARATOR мало кто знает :) а все потому что include_path (в частности set_include_path() ) очень редко где используется. Я бы и сам никогда не узнал про это и не наступил бы на некоторые грабли, если бы не Zend Framework, который установить нестандартно без переопределения include_path очень тяжело.
Итак, include_path - настройка, которую можно переопределять в скриптах. Работает это так - когда делается require 'somefile.php'; - интерпретатор вначале ищет файл в той же папке, что и запускаемый скрипт, если не находит, он начинает искать этот же файл в других папках, указанных в include_path. Штука полезная, однако есть подводный камень - include_path - это строка, папки разделены разделителем - причем в винде это ';' а в линухе':'. Тут-то нам и нужна эта константа, которая позволит скриптам запускаться и там и там без лишних конфигов или изменений кода.