У меня есть этот класс, который создает объект XML. Это класс Singleton, и я использую его в двух разных методах из другого класса:
Родительский класс:
class Foo {
public function init() {
// Here everything is ok
$bar = Bar::getInstance();
$bar->xml; // DOMDocument object
/* Output:
DOMDocument object {
doctype => null
implementation => (string) (object value omitted)
documentElement => null
actualEncoding => (string) UTF-8
encoding => (string) UTF-8
xmlEncoding => (string) UTF-8
standalone => (bool) true
xmlStandalone => (bool) true
version => (string) 1.0
xmlVersion => (string) 1.0
strictErrorChecking => (bool) true
documentURI => null
config => null
formatOutput => (bool) false
validateOnParse => (bool) false
resolveExternals => (bool) false
preserveWhiteSpace => (bool) true
recover => (bool) false
substituteEntities => (bool) false
nodeName => (string) #document
nodeValue => null
nodeType => (int) 9
parentNode => nu...
*/
}
public function grid() {
// Not ok
$bar = Bar::getInstance();
$bar->xml; // Not the same object
/* Output
DOMDocument object {
implementation => (string) (object value omitted)
strictErrorChecking => (bool) false
config => null
formatOutput => (bool) false
validateOnParse => (bool) false
resolveExternals => (bool) false
preserveWhiteSpace => (bool) false
recover => (bool) false
substituteEntities => (bool) false
}
*/
}
}
Дочерний класс: (Класс Singleton)
class Bar {
public $xml = null;
public function __construct() {
$this->xml = new DOMDocument('1.0', 'UTF-8');
}
}
Проблема в том, что во втором методе Foo (Foo->grid())
свойство xml класса Bar
- это не тот же объект, а какой-то пустой объект DOMDocument
.
Примечание: когда Я называю Bar::getInstance()
он использует unserialize()
для воссоздания объекта (в методе (Foo->grid())
) после его первой инициализации. Я думаю, что в процессе десериализации свойство xml теряет свои характеристики.
У кого-нибудь есть подсказка?
PS: я принимаю лучшие идеи о том, как сохранить состояние $xml
объект при вызове из более чем одного метода.
PS 2: методы класса Foo
вызываются из представления через AJAX. Например:
$.post('Foo/init', [], function() {}
$.post('Foo/grid', [], function() {}
Это метод getInstance()
public static function getInstance(...$arguments)
{
$className = get_called_class();
$ser = Session::getInstance()->getObj($className, null);
if (!isset(parent::$instance[$className]) && !is_null($ser)) {
parent::$instance[$className] = unserialize($ser);
} elseif (!isset(parent::$instance[$className])) {
parent::$instance[$className] = new $className(func_get_args());
}
return parent::$instance[$className];
}