【发布时间】:2015-02-04 18:16:05
【问题描述】:
我遇到了一个C library,我想从中使用PHP 中的函数。这个question 让我走上了php-cpp 的轨道。但是我在任何地方都不清楚是否可以将 php-cpp 用于纯 C。
互联网上的大多数消息来源都说将 C 与 C++ 混合起来很简单,所以我想知道是否值得花时间学习实现目标所需的知识。
【问题讨论】:
我遇到了一个C library,我想从中使用PHP 中的函数。这个question 让我走上了php-cpp 的轨道。但是我在任何地方都不清楚是否可以将 php-cpp 用于纯 C。
互联网上的大多数消息来源都说将 C 与 C++ 混合起来很简单,所以我想知道是否值得花时间学习实现目标所需的知识。
【问题讨论】:
但我不清楚是否可以将 php-cpp 用于纯 C。
如果您尝试包含任何 C++ 代码,这些代码实际上具有 C 程序中不支持的 C++ 特性。它根本不会编译。
互联网上的大多数消息来源都说将 C 与 C++ 混合起来很简单
只有在将 C 代码包含到 C++ 程序中时才会出现这种情况。即便如此,也有一些例外。
如果你这样做是因为你不懂 C++,如果你足够小心,你可以像 C 一样编写 C++ 程序(除了一些例外,比如 void 指针)。
【讨论】:
PHP-CPP 是一个 C++ 库,可用于开发 PHP 扩展。 不需要开发 PHP 扩展,尽管它可能会让您的生活更轻松一些。如果您不了解 C++,或者您不想使用它,您可以放心地忽略 PHP-CPP。有关开发 PHP 扩展(C 语言)的一些资源,请参阅“Getting Started with PHP Extension Development”。
完全可以从 C++ 调用 C 库。在大多数情况下,可以使用完全相同的语法;最多,您可能需要用extern "C" { ... } 包装C 头文件。
【讨论】:
extern "C" { ... } 东西在 php-cpp 中包含一个 C 库是完全可能的?
是的,您可以在 PHP-CPP 中将 C 与 C++ 混合,但对于初学者来说这不是一个好方法,因为您必须了解两者的相关 API。
对于那些能胜任这项任务的人,您需要从 PHP 中包含适当的头文件,就像您正在编写标准 C 扩展一样,例如
#include <php.h>
#include <php_globals.h>
#include <php_main.h>
#include <php_network.h>
// etc
您还需要为您的 PHP-CPP 项目修改 Makefile 并为您的 PHP 源位置添加准确的包含目录,对我来说是
COMPILER_FLAGS = -I/usr/local/include/php -I/usr/local/include/php/main ... etc ... -Wall -c -O2 -std=c++11 -fpic -o
将标准 PHP/ZEND API C 代码添加到您的 PHP-CPP 函数/类中
Php::Value example(Php::Parameters ¶ms)
{
zval myval;
zend_string *hello, *world;
hello = zend_string_init("hello", strlen("hello"), 0);
/* Stores the string into the zval */
ZVAL_STR(&myval, hello);
/* Reads the C string, from the zend_string from the zval */
php_printf("The string is %s", Z_STRVAL(myval));
world = zend_string_init("world", strlen("world"), 0);
/* Changes the zend_string into myval : replaces it by another one */
Z_STR(myval) = world;
zend_string_release(hello);
zend_string_release(world);
return Php::Value(Z_STRVAL(myval));
}
【讨论】: