Who needs singletons?

Posted by sexyprout on Stack Overflow See other posts from Stack Overflow or by sexyprout
Published on 2011-01-04T16:33:11Z Indexed on 2011/01/04 16:53 UTC
Read the original article Hit count: 208

Filed under:
|
|

Imagine you access your MySQL database via PDO. You got some functions, and in these functions, you need to access the database.
The first thing I thought of is global, like:

$db = new PDO('mysql:host=127.0.0.1;dbname=toto', 'root', 'pwd');

function some_function() {
    global $db;
    $db->query('...');
}

But it's considered as a bad practice. So, after a little search, I ended up with the Singleton pattern, which "applies to situations in which there needs to be a single instance of a class."
According to the example of the manual, we should do this:

class Database {
    private static $instance, $db;

    private function __construct(){}

    static function singleton() {
        if(!isset(self::$instance))
            self::$instance = new __CLASS__;

        return self:$instance;
    }

    function get() {
        if(!isset(self::$db))
            self::$db = new PDO('mysql:host=127.0.0.1;dbname=toto', 'user', 'pwd')

        return self::$db;
    }
}

function some_function() {
    $db = Database::singleton();
    $db->get()->query('...');
}

some_function();

But I just can't understand why you need that big class when you can do it merely with:

class Database {
    private static $db;

    private function __construct(){}

    static function get() {
        if(!isset(self::$rand))
            self::$db = new PDO('mysql:host=127.0.0.1;dbname=toto', 'user', 'pwd');

        return self::$db;
    }
}

function some_function() {
    Database::get()->query('...');
}

some_function();

This last one works perfectly and I don't need to worry about $db anymore.
But maybe I'm forgetting something. So, who's wrong, who's right?

© Stack Overflow or respective owner

Related posts about php

Related posts about oop