Первый вариант требует от функции раскрыть ~/ - чего она, похоже, не делает.
Второй нацеливается на файл в папке исполнения скрипта (а не на путь, где этот скрипт лежит).
Третий, скорее всего, просто упускает / между путем и именем файла ;)
Лучше всего, как сказано выше, отталкиваться от DOCUMENT_ROOT - сайты меняют хостинги и пути, скрипты перетасовываются... а еще лучше вообще не делать таких вещей.
Потому что файлы, лежащие в пределах веб-сервера, доступны не только вашим скриптам, но и внешним запросам. А это далеко не всегда то, что вы имели в виду.