2017-07-20 16 views
0

phpオブジェクトをハッシュテーブルに保存する方法と、保存されたphpオブジェクトをphp-extensionのハッシュテーブルから取得する方法は?ここで PHP拡張子のハッシュテーブルにPHPオブジェクトを保存するには?

は私のコードです:

//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は第二コール・IOC後にNULLです::( "foo" を)作ります。

すべてのコードはhttps://github.com/longmon/php-ioc.gitにプッシュされます。

ありがとうございました!

答えて

0

Hei、私は自分自身を解決しました!私の目的は、ハッシュテーブルからオブジェクトを取得することです、問題は、私は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); 
関連する問題