ini_set('display_setup_errors', 1); - Удалите эту строку, она бессмысленна.
ini_set('error_reporting', E_ALL); и ini_set('display_errors', 1); - Перенесите эти строки в общий файл, который включается во все остальные файлы.
empty после trim - Удалите эту строку, так как проверка на существование значения не имеет смысла.
if(trim($_POST['user_name']) && trim($_POST['user_email']) && trim($_POST['user_password'])) - Перепишите эту проверку следующим образом:
$user_name = trim($_POST['user_name']);
$user_email = trim($_POST['user_email']);
$user_password = trim($_POST['user_password']);
if($user_name && $user_email && $user_password)
Проверка if(isset($_SESSION['user_data'])) - Перенесите эту проверку в другое место, так как она не должна быть частью этого кода.
header('Location: '); - Добавьте после этой строки команду exit.
_once из require_once - Удалите '_once' из require_once, так как это избыточно.
require('database/ChatUser.php'); - Создайте простенький автозагрузчик, который будет автоматически подключать необходимые файлы.
Проверку if($user->saveData()) - Удалите эту проверку, так как она бессмысленна.
Вывод сообщений об ошибках в html - Создайте единый шаблон для вывода сообщений об ошибках и используйте его везде.
При ошибке выводите пользователю уже введенные значения (кроме пароля).
createAvatar - Вынесите этот функционал в отдельный класс.
$statement->execute($params) - Упростите этот код, заменив его на простой вызов execute с параметрами массива $params.
return $user_data - Переделайте этот блок кода, чтобы никаких проверок не было и чтобы переменная $user_data всегда была определена.