advocat
developer
singleton и __destruct в нескольких классах
имеется простой код, для понимаю, того, что я хочу
на выходе мы получим
Вопрос: как можно сделать, чтобы при использовании singleton можно было получить картину
имеется простой код, для понимаю, того, что я хочу
PHP:
class singleton
{
public static $dblayer = null;
public static $session = null;
public static function initClass($class)
{
switch ($class) {
case 'dblayer':
if (!self::$dblayer) {
self::$dblayer = new dblayer('singleton');
}
break;
case 'session':
if (!self::$session) {
self::$session = new session('singleton');
}
break;
default:
break;
}
}
}
class dblayer
{
protected $_method = null;
private $_connect = null;
public function __construct($method)
{
$this->_method = $method;
print __CLASS__.'->' .__FUNCTION__ . '(' .$this->_method. ')' . "\n";
//здесь создается $_connect
}
public function __destruct()
{
print __CLASS__.'->' .__FUNCTION__ . '(' .$this->_method. ')' . "\n";
//здесь умирает $_connect
}
public function foo($action)
{
//какие-то действие
//использует $_connect
}
}
class session
{
protected $_method = null;
public function __construct($method)
{
singleton::initClass('dblayer');
singleton::$dblayer->foo('start');
$this->_method = $method;
print __CLASS__.'->' .__FUNCTION__ . '(' .$this->_method. ')' . "\n";
}
public function __destruct()
{
singleton::$dblayer->foo('end');
print __CLASS__.'->' .__FUNCTION__ . '(' .$this->_method. ')' . "\n";
}
}
singleton::initClass('dblayer');
singleton::initClass('session');
$dblayer = new dblayer('new');
$session = new session('new');
при простой инициализации 2х классов через new, первым __destruct сработает у того класса, который был последним инициализирован, при использовании singleton pattern все получается наоборот ...dblayer->__construct(singleton)
session->__construct(singleton)
dblayer->__construct(new)
session->__construct(new)
session->__destruct(new)
dblayer->__destruct(new)
dblayer->__destruct(singleton)
session->__destruct(singleton)
Вопрос: как можно сделать, чтобы при использовании singleton можно было получить картину
dblayer->__construct(singleton)
session->__construct(singleton)
session->__destruct(singleton)
dblayer->__destruct(singleton)