首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在php-extension中将php对象保存到哈希表?

如何在php-extension中将php对象保存到哈希表?
EN

Stack Overflow用户
提问于 2017-07-20 10:34:35
回答 1查看 62关注 0票数 0

如何将php对象保存到hashtable中,以及如何在php-extension中从hashtable中获取保存的php obejct?

下面是我的代码:

代码语言:javascript
复制
//object_map has been init and alloc memory
//return_value is the return var of PHP_FUNCTION

zend_class_entry **class_ce,
object_init_ex(return_value, *class_ce); //create object
ioc_add_object_to_hash(name, return_value ); //save object

//find in the hashtable
if( zend_hash_find( object_map, name, sizeof(name), (void*)&return_value ) == SUCCESS ){

    php_printf("return_value:%p, %p,type:%d\n", return_value,&return_value, Z_TYPE_P(return_value));
    return 0;
}

//definition of ioc_add_object_to_hash
int ioc_add_object_to_hash( const char *name, zval *obj )
{
    if( !obj ){
        return -1;
    }
    if( !object_map ){
        return -1;
    }
    if( zend_hash_update( object_map, name, sizeof(name), obj, sizeof(*obj), NULL) == SUCCESS ){
        return 0;
    }
    return -1;
}

PHP代码:

代码语言:javascript
复制
   $filelist = array(
       "Foo" => realpath(__DIR__)."/Foo.php",
       "Bar" => realpath(__DIR__)."/Bar.php",
   );

   ioc::init( $filelist );


  var_dump(get_included_files());

  Bar::halo();

  $foo = ioc::make("Foo");

  echo $foo->get();

  $foo2 = ioc::make("Foo"); var_dump($foo2);

第二次调用ioc::make(“Foo”)后$foo2为空;

我所有的代码都是推送到https://github.com/longmon/php-ioc.git的。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2017-07-20 15:34:39

嘿,我自己解决了!我的目的是从哈希表中获取对象,问题是我错误地初始化了return_value,所以我正确地获取了NULL.The,如下所示:

代码语言:javascript
复制
if( !object_map ){
    php_error_docref(NULL TSRMLS_CC, E_NOTICE, "object_map had not been alloced");
    return -1;
}
zval **obj;
if( zend_hash_find( object_map, name, sizeof(name), (void **)&obj ) == SUCCESS ){
    Z_TYPE_P(return_value)   = IS_OBJECT;
    Z_OBJVAL_P(return_value) = Z_OBJVAL_PP(obj);
    //zval_ptr_dtor(obj);
    return 0;
}
return -1;

关键的一行是:

代码语言:javascript
复制
Z_TYPE_P(return_value)   = IS_OBJECT;
Z_OBJVAL_P(return_value) = Z_OBJVAL_PP(obj);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45204115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档