Концепция с дефолтным объектом - это хреновая затея. Подключение к БД вы например как в свойстве класса сделаете (не объекта)?
Трейты - это довольно опасная штука, которая расширяет функционал ваших классОВ. Вы же хотите, что бы она жила своей жизнью в контексте каждого класса, это не правильно, вам тут не Golang)).
На счет вашего примера работы с БД: вам трейты тут не нужны, от слова "совсем")). Расширьте ваш Query методами, что вы хотите пихать в трейты. Класс Select вам тоже не нужен, добавьте его функционал как метод в Query. Если я правильно понимаю Query - это объект с состоянием, который в результате должен суметь создать SQL код, дык добавьте в него еще метод getSQL().
Обратите внимание на защиту от SQL-инъекций. Что будет, если вызвать ваш Select так:
<?php
$query = new Select(
[
'table' => "1;DROP TABLE products;",
'fields' => [],
]
);
Вообще говоря: если цель понаучаться - дерзайте, если таки дело делаете - используйте Doctrine2, не стоит терять время для поделку, которая 99.99% будет хуже существующих аналогов.
Очень вам рекомендую, почитайте
PSR-2
Чуть не забыл:
Как инициализировать свойства типа Объект в trait'ах PHP?
В классе, который подключает трейт, на прямую, или через вызов метода из трейте.