You should
1) disable constructor by setting it to private.
2) create single PDO object by calling the static method only. Static method have to return the instance of PDO object.
In Silex or Symfony you will have to prefix class name with "\" or use "use \PDO;". Which means nothing more that this is a global class.
Ps. if you set the __constructor to public and use return functino note that it will not generate any exception or warning but you will get an class object returned and not actual value of return statement.
So $db = new Database() would return object of class Database. Then from there you would have to access your PDO using class method. $pdo = $db->getInstance() Which is not the right way to build proper singleton.
If you interested in reading more about singletons pros and cons and some use cases read this Best practice on PHP singleton classes, you will find more information about this pattern design.
/** * Singleton pattern */ class Database { /** * holds the only PDO instance */ private static $_instance; /** * private __constructor not accesible */ private function __construct() { self::$instance = new PDO( "mysql:host=localhost;dbname=live", "root", "root" ); } /** * clone will not duplicate object */ public function __clone() { die(__CLASS__ . ' class cant be instantiated. Please use the method called getInstance.'); } /** * the only public function to access or create PDO object */ public static function getInstance() { if(!self::$_instance instanceof PDO){ new self; } return self::$_instance; } }