Trzy sposoby, które podałeś nie są idealne. Traits jest często uznawany jako przykład inwalidy w kodzie, o czym ostatnio była ciekawa dyskusja na PHPersach.
Static nie jest dobrym rozwiązaniem, ponieważ hasRole() stanie się globalem, co również nie jest takie dobre - oczywiście można rozważać czy w tym konkretnie przypadku nie narobi żadnych szkód czy nie stworzy podwalin do ich narobienia. Jednak ja zwykle unikam statycznych, chyba, że używam czegoś takiego jak Named Constructors, które w miarę elegancki sposób załatwia sprawę braku wielu konstruktorów w PHP.
Zamiast extends lepiej implementować coś, lub tak, jak @Comandeer napisał - wykorzystać zależność. No i radziłbym Ci jego rozwiązanie, tylko przetraw dokładnie to, co napisał ;)