PHP singleton class structure - Am I doing it right?
I have a really big script. It has a database class, a base class, a user authentication class, a resellers authentication class, paypal ipn class, a downloads class, and a plugins class
The Base class extends database class like this:
class Base extends database
{
var $userid;
var $root;
var $config
function Base($username, $password, $host, $database)
{
// Init DB
$this -> database($hostname, $database, $username, $password);
$this -> config = $this -> fetch(...);
// and the code goes on
}
function anyFunction()
{
$this -> Downloads -> dloadFunction();
}
}
class users extends Base
{
var $userData;
function users()
{
// initialize user, check if he is logged in, if he has cookies, load the user vars in $this -> userData
}
function userFunction1()
{
$this -> anyFunction();
}
}
class resellers extends Base
{
var $resellerData;
function resellers()
{
// initialize resellers, check if he is logged in, if he has cookies, load the user vars in $this -> resellerData
}
}
class IPN extends Base
{
}
class Downloads extends Base
{
function dloadFunction()
{
}
}
class Plugins extends Downloads
{
}
?>
And I call my code like this :
<?php
$Base = new Base($user, $pass, $host, $db);
$user = new user();
$Base -> user = $user;
$reseller = new reseller();
$Base -> reseller = $reseller;
$downloads = new Downloads();
$downloads -> Plugins = new Plugins();
$Base -> Downloads = $downloads;
$Base -> users -> updateEmail();
// and the code goes on..
?>
I think the structure is really bad. 开发者_C百科Thats why I want to implement singleton method. how can I achieve this ?
Please help.
Example of singleton pattern realization in PHP (since 5.3):
/**
* Singleton pattern implementation
*/
abstract class Singleton {
/**
* Collection of instances
* @var array
*/
private static $_aInstance = array();
/**
* Private constructor
*/
private function __construct(){}
/**
* Get instance of class
*/
public static function getInstance() {
// Get name of current class
$sClassName = get_called_class();
// Create new instance if necessary
if( !isset( self::$_aInstance[ $sClassName ] ) )
self::$_aInstance[ $sClassName ] = new $sClassName();
$oInstance = self::$_aInstance[ $sClassName ];
return $oInstance;
}
/**
* Private final clone method
*/
final private function __clone(){}
}
Example of usage:
class Example extends Singleton {}
$oExample1 = Example::getInstance();
$oExample2 = Example::getInstance();
echo ( is_a( $oExample1, 'Example' ) && $oExample1 === $oExample2)
? 'Same' : 'Different', "\n";
精彩评论