DOMDocument как свойство класса - PullRequest
0 голосов
/ 02 марта 2020

У меня есть этот класс, который создает объект 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];
    }
...