I wrote C ++ - a library that provides several classes. I also wrote a php extension using zend as a wrapper over the C ++ library.
I have a problem with serializing my objects when, for example, I try to save them in $ _SESSION.
Here is an example:
struct spider_object { zend_object m_std; Spider::QGramTokenizer* m_pObject; }; ... zend_class_entry *spider_QGramTokenizer_ce; PHP_METHOD(spider_QGramTokenizer, __construct) { long lQGramSize; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &lQGramSize) == FAILURE) { WRONG_PARAM_COUNT; } Spider::QGramTokenizer* pQT = new Spider::QGramTokenizer(static_cast<uint16_t>(lQGramSize)); spider_object* pO = static_cast<spider_object*>(zend_object_store_get_object(getThis() TSRMLS_CC)); pO->m_pObject = pQT; } PHP_METHOD(spider_QGramTokenizer, getQGramSize) { spider_object *pO = static_cast<spider_object*>(zend_object_store_get_object(getThis() TSRMLS_CC)); Spider::QGramTokenizer* pQT = static_cast<Spider::QGramTokenizer*>(pO->m_pObject); if (pQT != NULL) { RETURN_LONG(pQT->getQGramSize()); } else zend_error(E_ERROR, "Null QGramTokenizer instance.\n"); }
I create a spider_QGramTokenizer object in my script and it works fine. As soon as I save it as a session variable and try to get it from another script, I will return it back, but if I call getQGramSize, I will get the error "Null QGramTokenizer".
In other words, serialize () doesn't know how __sleep or __wakeup is an instance of spider_object :: m_pObject, and it just sets it to null. Or, in fact, the entire spider_object instance stored in zend_object_store does not receive serialization at all.
I was thinking about overriding __sleep and __wakeup, but I donβt know what zend does under the hood and what should be the return array from __sleep, as well as how can I build my own m_pObject related data there? Is it possible?
source share