错误 '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 2017 和 PHP 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", ¶mOne, ¶mTwo) == 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", ¶mOne, ¶mTwo) == 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
声明之前。
我是 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 2017 和 PHP 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", ¶mOne, ¶mTwo) == 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", ¶mOne, ¶mTwo) == 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
声明之前。