Ещё file_get_contents не умеет прозрачно распаковывать Content-Encoding: gzip/deflate/br, не работает с multipart-data, а также не работает с chanked transfer.
Если говорить об универсальности, то лучше вообще guzzle использовать, т. к. предоставляет все нужные обертки и обработчики.
Евгений, потому что populateTree() загружает дерево из БД в связи `children`, и возвращает сам узел. Таким образом, можно обойти всё дерево обращением, например, $root->children[0]->children[0]->title, при этом обращений к БД более не будет.
Arik: сама рекурсия не так страшна, если речь, конечно, не о >10k элементов. Nested Set, как показали выше (по ссылке на расширение yii1), можно в принципе обойти без рекурсии, однако читабельность такого кода несколько ниже.
Павел Гоголинский: Максим Тимофеев всё правильно подсказывает, если вам нужна сортировка рутовых узлов, вводите доп. поле sort, и сортируйте с помощью него. На детей не повлияет, если вы не будете отменять их сортировку по полю lft (у корневых узлов lft всегда равен 1).
Но вообще, лучше и проще, если вам требуется несколько корневых узлов для какой-то сущности - создать один корневой узел который не будет показываться для пользователя, а в него уже добавлять узлы, которые будут видны как рутовые с возможностью сортировки стандартными методами.
Ну, наверху тоже возможно трансформация. Самый простой способ проверить, есть ли трансформация текста - создать пустой слой в Photoshop и написать в нём текст таким же размером, как целевой текст. Если разница в размере есть, значит трансформация есть.