错误 'zif_test_addme':未声明的标识符 - php 扩展开发

Error 'zif_test_addme': undeclared identifier - php extension development

我是 windows 中 php 扩展开发的新手,正在阅读本系列文章来学习它:- https://jojokahanding.wordpress.com/2014/05/26/writing-php-extensions-for-windowswriting-the-extension/

我按照this article成功搭建了扩展开发的编译环境。它正在成功构建。但是当我在其中编写函数以添加两个数值并尝试构建它时。它在 phpTestModule.php:-

的第 11 行抛出了这个错误
'zif_test_addme': undeclared identifier 

第 11 行代码是:-

  PHP_FE(test_addme,NULL)

为什么会出现这个错误?

我用谷歌搜索并从 php 网站找到了 this,并尝试用 [=57 替换 PHP_FE =] 并以 ZEND_FE_END 结束。但即便如此也没有用,我最终得到了同样的错误。请帮助。

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

尝试添加参考文章中提到的 php 文件

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

您需要forward-declare PHP 函数绑定。您可以在 header 中作为外部函数或在 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 函数 declaration/definition。它映射到类似 void zif_test_addme(INTERNAL_FUNCTION_PARAMETERS) 的东西,其中 INTERNAL_FUNCTION_PARAMETERS 是定义函数绑定实现所需的实际参数的宏(您实际上不必担心这些)。您可以在声明上下文 定义中使用它。当然,定义也是声明,因此您可以将 PHP_FUNCTION(test_addme) 的实现移动到 zend_function_entry 声明之前。