2017-07-20 36 views
0

如何將php對象保存到hashtable以及如何從php-extension中的hashtable中獲取保存的php對象?如何將php對象保存到php-extension中的hashtable?

這裏是我的代碼:

//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代碼:

$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); 

的$ foo2的是後第二個電話國際奧委會NULL ::使( 「富」);

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

謝謝!

回答

0

嘿,我解決了我自己!我的目的是從哈希表中獲取對象,問題是我做了錯誤的方式初始化RETURN_VALUE,所以我得到了NULL.The正確的方法是象下面這樣:

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; 

重點線是:

Z_TYPE_P(return_value) = IS_OBJECT; 
Z_OBJVAL_P(return_value) = Z_OBJVAL_PP(obj); 
相關問題