>Can you show some code? It will help to figure out >what's wrong. Yes I can :)
stringclass.h #ifndef PHP_STRINGCLASS_H #define PHP_STRINGCLASS_H extern zend_module_entry string_module_entry; #define phpext_string_ptr &string_module_entry #ifdef PHP_WIN32 #define PHP_STRING_API __declspec(dllexport) #else #define PHP_STRING_API #endif #ifdef ZTS #include "TSRM.h" #endif PHP_MINIT_FUNCTION(string); PHP_MSHUTDOWN_FUNCTION(string); PHP_RINIT_FUNCTION(string); PHP_RSHUTDOWN_FUNCTION(string); PHP_MINFO_FUNCTION(string); #define STRING_METHOD(function_name) \ ZEND_NAMED_FUNCTION(c_stringclass_##function_name) #define STRING_ME(name, arg_info, flags) \ ZEND_FENTRY(name, c_stringclass_ ##name, arg_info, flags) #ifdef ZTS #define string_G(v) TSRMG(string_globals_id, zend_string_globals *, v) #else #define string_G(v) (string_globals.v) #endif #endif ---------------------------------------------------------------------- And stringclass.c #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_ini.h" #include "ext/standard/info.h" #include "zend_compile.h" #include "zend_interfaces.h" #include "zend_exceptions.h" #include "ext/standard/php_smart_str.h" #include "ext/standard/php_string.h" #include "php_stringclass.h" static zend_class_entry *string_ce; #ifdef COMPILE_DL_STRING ZEND_GET_MODULE(string) #endif STRING_METHOD(__construct); STRING_METHOD(length); STRING_METHOD(toLower); STRING_METHOD(toUpper); STRING_METHOD(trim); //STRING_METHOD(concat); //STRING_METHOD(__toString); //STRING_METHOD(replace); //and so on static ZEND_BEGIN_ARG_INFO(arginfo_String___construct, 0) ZEND_ARG_INFO(0, str) // parameter name ZEND_END_ARG_INFO(); static zend_function_entry string_functions[] = { STRING_ME(__construct, arginfo_String___construct, ZEND_ACC_PUBLIC) STRING_ME(length, NULL, ZEND_ACC_PUBLIC) STRING_ME(toLower, NULL, ZEND_ACC_PUBLIC) STRING_ME(toUpper, NULL, ZEND_ACC_PUBLIC) STRING_ME(trim, NULL, ZEND_ACC_PUBLIC) //STRING_ME(concat, NULL, ZEND_ACC_PUBLIC) //STRING_ME(__toString, NULL, ZEND_ACC_PUBLIC) //STRING_ME(replace, NULL, ZEND_ACC_PUBLIC) {NULL, NULL, NULL} }; static zend_object_handlers string_handlers; typedef struct _string_object { zend_object std; char *data; int len; } string_object; static void string_object_free_storage(void *object TSRMLS_DC) { string_object *intern = (string_object *)object; zend_hash_destroy(intern->std.properties); FREE_HASHTABLE(intern->std.properties); if(intern->data) { efree(intern->data); } efree(object); } static zend_object_value string_object_new_ex(zend_class_entry *class_type, string_object **obj TSRMLS_DC) { zend_object_value retval; string_object *intern; zval *tmp; intern = emalloc(sizeof(string_object)); memset(intern, 0, sizeof(string_object)); intern->std.ce = class_type; *obj = intern; ALLOC_HASHTABLE(intern->std.properties); zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0); zend_hash_copy(intern->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); retval.handle = zend_objects_store_put(intern, NULL, (zend_objects_free_object_storage_t) string_object_free_storage, NULL TSRMLS_CC); retval.handlers = &string_handlers; return retval; } static zend_object_value string_object_new(zend_class_entry *class_type TSRMLS_DC) { string_object *tmp; return string_object_new_ex(class_type, &tmp TSRMLS_CC); } static zend_object_value string_object_clone(zval *zobject TSRMLS_DC) { zend_object_value new_obj_val; zend_object *old_object; zend_object *new_object; zend_object_handle handle = Z_OBJ_HANDLE_P(zobject); string_object *intern; old_object = zend_objects_get_address(zobject TSRMLS_CC); new_obj_val = string_object_new_ex(old_object->ce, &intern TSRMLS_CC); new_object = &intern->std; zend_objects_clone_members(new_object, new_obj_val, old_object, handle TSRMLS_CC); return new_obj_val; } #if MBO_0 static zend_class_entry *string_get_ce(zval *object TSRMLS_DC) { return string_object; } #endif #if PHP_MAJOR_VERSION >= 6 #define EXTSRM TSRMLS_C #else #define EXTSRM #endif STRING_METHOD(__construct) { zval *object = getThis(); string_object *intern; char *str; long strlen; php_set_error_handling(EH_THROW, zend_exception_get_default(EXTSRM) TSRMLS_CC); intern = (string_object*)zend_object_store_get_object(object TSRMLS_CC); if(ZEND_NUM_ARGS() > 0) { if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &str, &strlen) == FAILURE) { php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); return; } intern->data = estrdup(str); intern->len = strlen; } else { intern->data = ""; intern->len = 0; } php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); } STRING_METHOD(length) { zval *object = getThis(); string_object *intern; intern = (string_object*)zend_object_store_get_object(object TSRMLS_CC); RETVAL_LONG(intern->len); } STRING_METHOD(toLower) { zval *object = getThis(); string_object *intern; char* ret; intern = (string_object*)zend_object_store_get_object(object TSRMLS_CC); ret = estrdup(intern->data); if(intern->len > 0) { php_strtolower(ret, intern->len); } RETVAL_STRING(ret, 1); } STRING_METHOD(toUpper) { zval *object = getThis(); string_object *intern; char* ret; intern = (string_object*)zend_object_store_get_object(object TSRMLS_CC); ret = estrdup(intern->data); if(intern->len > 0) { php_strtoupper(ret, intern->len); } RETVAL_STRING(ret, 1); } STRING_METHOD(trim) { zval *object = getThis(); string_object *intern; char *what; int what_len; int argc = ZEND_NUM_ARGS(); zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &what, &what_len); intern = (string_object*)zend_object_store_get_object(object TSRMLS_CC); if(argc == 1) { php_trim(intern->data, intern->len, what, what_len, return_value, 3 TSRMLS_CC); } else { php_trim(intern->data, intern->len, NULL, 0, return_value, 3 TSRMLS_CC); } } zend_module_entry string_module_entry = { #if ZEND_MODULE_API_NO >= 20010901 STANDARD_MODULE_HEADER, #endif "string", string_functions, PHP_MINIT(string), PHP_MSHUTDOWN(string), PHP_RINIT(string), /* Replace with NULL if there's nothing to do at request start */ PHP_RSHUTDOWN(string), /* Replace with NULL if there's nothing to do at request end */ PHP_MINFO(string), #if ZEND_MODULE_API_NO >= 20010901 "0.1", /* Replace with version number for your extension */ #endif STANDARD_MODULE_PROPERTIES }; PHP_MINIT_FUNCTION(string) { zend_class_entry ce; INIT_CLASS_ENTRY(ce, "String", string_functions); string_ce = zend_register_internal_class(&ce TSRMLS_CC); string_ce->create_object = string_object_new; memcpy(&string_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); string_handlers.clone_obj = string_object_clone; return SUCCESS; } PHP_MSHUTDOWN_FUNCTION(string) { return SUCCESS; } PHP_RINIT_FUNCTION(string) { return SUCCESS; } PHP_RSHUTDOWN_FUNCTION(string) { return SUCCESS; } PHP_MINFO_FUNCTION(string) { php_info_print_table_start(); php_info_print_table_header(2, "class String", "enabled"); php_info_print_table_end(); } ----------------------------------------------------------------------------------------------------------------------------------------- There are some more methods in there but the trim is present. I left over the hlf of the methods out. trim() is definied by the normal string-functions. Thats why I think I get the warning. But current(), next() and so on in ArrayIterator works also and they are definied as normal array functions too. Daniel -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php