2011-12-31 17 views
1

SWIGを使用してC++クラスをPHPに統合していますが、関数が正しく表示されても何らかの理由でクラスが正しく表示されません。これはMac OS X 10.5.8のSWIG 2.0.4とPHP 5.3.6です。SWIGを使用してPHPにC++クラスを組み込む

$ cat example.i 
%{ 
#include <stdio.h> 
#include "example.h" 
int Example::foo(void) { 
    printf("This is foo\n"); 
    return 0; 
} 
%} 
%module example 

class Example { 
public: 
    int foo(void); 
}; 
$ cat example.h 
class Example { 
public: 
    int foo(void); 
}; 
$ make ehphp 
/opt/local/bin/swig -c++ -php5 example.i 
g++ `php-config --includes` -fPIC -c example_wrap.cpp -o example_wrap.o 
g++ -dynamiclib -Wl,-flat_namespace,-U,_zend_register_resource,-U,_zend_rsrc_list_get_rsrc_type,-U,_zend_wrong_param_count,-U,_compiler_globals,-U,_zend_hash_find,-U,_gc_remove_zval_from_buffer,-U,_zend_register_long_constant,-U,_zend_get_constant,-U,__efree,-U,__emalloc,-U,_zend_error,-U,__zend_list_find,-U,_main,-U,__zend_get_parameters_array_ex,-U,_zend_register_list_destructors_ex,-U,__zval_copy_ctor_func,-U,__convert_to_string,-U,__zend_hash_add_or_update,-U,_executor_globals,-U,_zval_used_for_init,-U,_zval_is_true,-U,__object_init,-U,_php_strtolower,-U,__estrndup,-U,__object_init_ex,-U,_zend_lookup_class -o ehphp.dylib example_wrap.o 
sudo cp ehphp.dylib /opt/local/lib/php/extensions/no-debug-non-zts-20090626/ehphp.dylib 
$ php -a 
Interactive shell 

php > var_dump(dl("ehphp.dylib")); 
bool(true) 
php > var_dump(function_exists("bar")); 
bool(true) 
php > var_dump(class_exists("Example")); 
bool(false) 
php > 
+0

+1完全ではあるが最小限の例です。 (あなたは '%inline%{%}'を使って単一の.iファイルに単純化することができます) – Flexo

答えて

1

私はあなたがロードされたプロキシクラスを取得するために

require "Example.php"; 

ことになっていると信じて:ここでは、コードやライブラリを構築するために使用されるコマンドです。 (phpファイルはSWIGによって生成されています)

+0

PHPファイルは、ここでphp -aで別にやっている "dl"呼び出しを単にラップします。 –

+0

私はここにあるものでそれだけではありません。あなたのexample.iファイルでswigを呼び出し、example.phpファイルにはDLLのロード以上の_way_が含まれています。特に、 'class Example'を持っています。 – Mat

+0

あなたは完全に正しいです。私はSWIGがこのコードを.phpファイルに入れていることに気づいていませんでした。助けてくれてありがとう! –