@@ -123,6 +123,40 @@ zval *xmlreader_get_property_ptr_ptr(zend_object *object, zend_string *name, int
123
123
}
124
124
/* }}} */
125
125
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
+
126
160
/* {{{ xmlreader_read_property */
127
161
zval * xmlreader_read_property (zend_object * object , zend_string * name , int type , void * * cache_slot , zval * rv )
128
162
{
@@ -159,6 +193,18 @@ zval *xmlreader_write_property(zend_object *object, zend_string *name, zval *val
159
193
}
160
194
/* }}} */
161
195
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
+
162
208
/* {{{ */
163
209
static zend_function * xmlreader_get_method (zend_object * * obj , zend_string * name , const zval * key )
164
210
{
@@ -1293,8 +1339,10 @@ PHP_MINIT_FUNCTION(xmlreader)
1293
1339
memcpy (& xmlreader_object_handlers , & std_object_handlers , sizeof (zend_object_handlers ));
1294
1340
xmlreader_object_handlers .offset = XtOffsetOf (xmlreader_object , std );
1295
1341
xmlreader_object_handlers .free_obj = xmlreader_objects_free_storage ;
1342
+ xmlreader_object_handlers .has_property = xmlreader_has_property ;
1296
1343
xmlreader_object_handlers .read_property = xmlreader_read_property ;
1297
1344
xmlreader_object_handlers .write_property = xmlreader_write_property ;
1345
+ xmlreader_object_handlers .unset_property = xmlreader_unset_property ;
1298
1346
xmlreader_object_handlers .get_property_ptr_ptr = xmlreader_get_property_ptr_ptr ;
1299
1347
xmlreader_object_handlers .get_method = xmlreader_get_method ;
1300
1348
xmlreader_object_handlers .clone_obj = NULL ;
0 commit comments