@@ -123,6 +123,40 @@ zval *xmlreader_get_property_ptr_ptr(zend_object *object, zend_string *name, int
123123}
124124/* }}} */
125125
126+ static int xmlreader_has_property (zend_object * object , zend_string * name , int type , void * * cache_slot )
127+ {
128+ xmlreader_object * obj = php_xmlreader_fetch_object (object );
129+ xmlreader_prop_handler * hnd = zend_hash_find_ptr (& xmlreader_prop_handlers , name );
130+
131+ if (hnd != NULL ) {
132+ if (type == ZEND_PROPERTY_EXISTS ) {
133+ return 1 ;
134+ }
135+
136+ zval rv ;
137+ if (xmlreader_property_reader (obj , hnd , & rv ) == FAILURE ) {
138+ return 0 ;
139+ }
140+
141+ bool result ;
142+
143+ if (type == ZEND_PROPERTY_NOT_EMPTY ) {
144+ result = zend_is_true (& rv );
145+ } else if (type == ZEND_PROPERTY_ISSET ) {
146+ result = (Z_TYPE (rv ) != IS_NULL );
147+ } else {
148+ ZEND_UNREACHABLE ();
149+ }
150+
151+ zval_ptr_dtor (& rv );
152+
153+ return result ;
154+ }
155+
156+ return zend_std_has_property (object , name , type , cache_slot );
157+ }
158+
159+
126160/* {{{ xmlreader_read_property */
127161zval * xmlreader_read_property (zend_object * object , zend_string * name , int type , void * * cache_slot , zval * rv )
128162{
@@ -159,6 +193,18 @@ zval *xmlreader_write_property(zend_object *object, zend_string *name, zval *val
159193}
160194/* }}} */
161195
196+ void xmlreader_unset_property (zend_object * object , zend_string * name , void * * cache_slot )
197+ {
198+ xmlreader_prop_handler * hnd = zend_hash_find_ptr (& xmlreader_prop_handlers , name );
199+
200+ if (hnd != NULL ) {
201+ zend_throw_error (NULL , "Cannot unset %s::$%s" , ZSTR_VAL (object -> ce -> name ), ZSTR_VAL (name ));
202+ return ;
203+ }
204+
205+ zend_std_unset_property (object , name , cache_slot );
206+ }
207+
162208/* {{{ */
163209static zend_function * xmlreader_get_method (zend_object * * obj , zend_string * name , const zval * key )
164210{
@@ -1293,8 +1339,10 @@ PHP_MINIT_FUNCTION(xmlreader)
12931339 memcpy (& xmlreader_object_handlers , & std_object_handlers , sizeof (zend_object_handlers ));
12941340 xmlreader_object_handlers .offset = XtOffsetOf (xmlreader_object , std );
12951341 xmlreader_object_handlers .free_obj = xmlreader_objects_free_storage ;
1342+ xmlreader_object_handlers .has_property = xmlreader_has_property ;
12961343 xmlreader_object_handlers .read_property = xmlreader_read_property ;
12971344 xmlreader_object_handlers .write_property = xmlreader_write_property ;
1345+ xmlreader_object_handlers .unset_property = xmlreader_unset_property ;
12981346 xmlreader_object_handlers .get_property_ptr_ptr = xmlreader_get_property_ptr_ptr ;
12991347 xmlreader_object_handlers .get_method = xmlreader_get_method ;
13001348 xmlreader_object_handlers .clone_obj = NULL ;
0 commit comments