2017-08-20 8 views
0

私は窓にPHPの拡張機能の開発に新しいですし、それを学ぶためにこの連載以下: - https://jojokahanding.wordpress.com/2014/05/26/writing-php-extensions-for-windowswriting-the-extension/エラー「zif_test_addme」:宣言されていない識別子 - PHP拡張モジュールの開発

私は正常で拡張機能開発のためのコンパイル環境を構築しました以下はthis articleです。それはうまくいっていた。しかし、私はそれに2つの数値を追加する関数を書いて、それを構築しようとしました。

'zif_test_addme': undeclared identifier 

11行のコードである: - - :

PHP_FE(test_addme,NULL) 

私はこのエラーを取得していますなぜそれがphpTestModule.phpで11行目で、このエラーは私を投げますか?

私はGoogleで検索し、PHPのWebサイトからthisを発見し、ZEND_FEによってPHP_FEを交換し、ZEND_FE_ENDことによってそれを終了しようとしています。しかし、それも動作していないと私は同じエラーが発生してしまう。 Plzヘルプ。

PS: - 私は拡張機能を構築するためにのVisual Studio 2017PHP 7.0.22を使用していますし、私のシステムが64ビットです。

コードスニペット: -

phpTestModule.cpp

// phpTestModule.cpp : Defines the exported functions for the DLL 
application. 
// 

#include "stdafx.h" 


#define PHP_TEST_EXTNAME "test" 
#define PHP_TEST_VERSION "1.0.30" 

zend_function_entry test_functions[] = { 
    PHP_FE(test_addme,NULL) 
    {NULL,NULL,NULL} 
}; 

zend_module_entry test_module_entry = { 
#if ZEND_MODULE_API_NO>=20010901 
    STANDARD_MODULE_HEADER, 
#endif 
    PHP_TEST_EXTNAME, 
    test_functions, 
    NULL, 
    NULL, 
    NULL, 
    NULL, 
    NULL, 
#if ZEND_MODULE_API_NO>=20010901 
    PHP_TEST_VERSION, 
#endif 
    STANDARD_MODULE_PROPERTIES 
}; 

ZEND_GET_MODULE(test); 

PHP_FUNCTION(test_addme) 
{ 
    long paramOne; 
    long paramTwo; 
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &paramOne, &paramTwo) == FAILURE) 
    { 
     RETURN_FALSE; 
    } 
    RETURN_LONG(paramOne + paramTwo); 
} 

stdafx.hを

// stdafx.h : include file for standard system include files, 
// or project specific include files that are used frequently, but 
// are changed infrequently 
// 

#pragma once 

#include "targetver.h" 

#define WIN32_LEAN_AND_MEAN    // Exclude rarely-used stuff from Windows headers 
// Windows Header Files: 
#include <windows.h> 

#ifdef _DEBUG 
#define ZEND_DEBUG 1 
#else 
#define ZEND_DEBUG 0 
#endif 

#define ZTS 1 
#define ZEND_WIN32 1 
#define PHP_WIN32 1 

#include<math.h> 
#include<wchar.h> 
#include<io.h> 
#include<php.h> 

#pragma comment(lib,"php7ts.lib") 
// TODO: reference additional headers your program requires here 

答えて

1

PHP関数バインディングをforward-declareする必要があります。これは、外部関数としてヘッダーで、またはphpTestModule.cppコンパイル単位で静的関数として行うことができます。

定義の場合と同じように、PHP_FUNCTIONマクロを必ず使用してください。

// Forward declare PHP function bindings: 
static PHP_FUNCTION(test_addme); 

// Define list of functions provided by the extension module: 
zend_function_entry test_functions[] = { 
    PHP_FE(test_addme,NULL) 
    {NULL,NULL,NULL} 
}; 

// PHP function binding definition: 
PHP_FUNCTION(test_addme) 
{ 
    long paramOne; 
    long paramTwo; 
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &paramOne, &paramTwo) == FAILURE) 
    { 
     RETURN_FALSE; 
    } 
    RETURN_LONG(paramOne + paramTwo); 
} 

説明

PHP_FUNCTIONマクロは、基本的に、通常のC関数宣言/定義と評価。 void zif_test_addme(INTERNAL_FUNCTION_PARAMETERS)のようなものにマップされます。INTERNAL_FUNCTION_PARAMETERSは、関数バインディングの実装に必要な実際の引数を定義するマクロです(実際にはこれらについて心配する必要はありません)。宣言コンテキストまたは定義の両方でこれを使用できます。もちろん、定義は宣言でもあるため、zend_function_entry宣言の前に実装したPHP_FUNCTION(test_addme)をちょうど動かすことができました。

+0

ありがとうございました。それは今働いている。 –

-1

参照記事

で述べたようにPHPファイルを追加してみてください

<?php echo test_addme(2, 3); ?>

+1

この問題は、PHPユーザー空間からの拡張機能のテストではなく、C++コードのコンパイルに関するものです。 –

関連する問題