Только своего рода ответ, и несколько своеобразный:
Но я бы посоветовал, чтобы ваш объект сопровождался заводской процедурой вместо:
class foo { .... }
function foo() { return new foo; }
Это может устранить некоторую путаницу для вас. И даже выглядит немного лучше, избегая сочетания статических и объектных вызовов методов:
foo()->bar()->b();
Это в основном экстернализует статическую функцию. А ваш объект реализует только цепочечные методы, которые возвращают $ this или фактические результаты.