【问题标题】:why does php extension development differ so much from c++ development?为什么 php 扩展开发与 c++ 开发有如此大的不同?
【发布时间】:2012-03-27 14:49:54
【问题描述】:

我从事 PHP 开发已经很长时间了,并且我开始遇到该语言的一些限制。因此,话虽如此,我认为我的开发周期的下一步是转向 C++,并构建一些扩展!

当我浏览了一些标准的“Hello World”之类的教程时,大部分内容似乎都很有意义。我构建了一个相当不错的井字游戏应用程序,所以我认为是时候开始深入研究 PECL 并看看它是如何工作的。然而,我的发现让我大吃一惊。

谁能解释一下这样做的目的和原因:

PHP_FUNCTION(helloWorld)
{
    RETURN_STRING("Hello World");
}

并非如此:

string helloWorld()
{
    return "Hello World"
}

PHP_REGISTER_METHOD("helloWorld");

我并没有假装我比创造这种语言的人知道的更多,我也没有试图挑起任何麻烦。似乎(至少从初学者的角度来看)创建 PHP 扩展与编写 C++ 程序完全不同。除了一些基本的语法规则之外,它几乎是一种完全不同的语言。

任何帮助将不胜感激。只是一个试图成长的初学者:)

【问题讨论】:

  • 猜测,PHP_FUNCTION 和 RETURN_STRING 是做“幕后”工作的宏。
  • php 将每一位数据包装在一大堆元数据中。它自己的函数,如 register_string(),为你处理所有这些。
  • 我不想听起来居高临下,但是您有多少使用 C++ 编写实际程序或使用具有大量现有代码库的实际 C++ 程序的经验?
  • 完全没有。我试图在我的帖子中概述这一点,但实际上我只花了一周左右的时间,这只是我试图理解的初步印象。
  • @syntaqx:这就是 php 插件的实现方式。它仍然是带有一堆包装器的 c++。您可能可以手动完成所有操作,但这些包装函数掩盖了很多“挥舞锤子”类型的忙碌工作。

标签: php c++ pecl


【解决方案1】:

PHP 扩展开发与其他 C/C++ 开发没有太大区别。唯一特别的是您必须将 PHP 脚本世界与您的 C/C++ 函数连接起来。这个任务不简单,这里需要 PHP_FUNCTION 等奇怪的宏。

例如,如果您想从 PHP 调用函数“helloWorld”,解释器需要查找“helloWorld”并将其映射到 C 函数。这个函数需要有一个特定的签名,这意味着它必须接受一组特定的参数,并且必须返回一个特定的值。这不是任意的,解释器不能只调用任何 C/C++ 函数。

这就是 C 等低级语言的工作方式,您无法“检查”函数采用何种参数。

特别是,PHP 解释器中的所有值都是无法转换为 C++ 类型的特殊结构。 PHP 字符串与 C++ std::string 不同。 PHP API 提供了各种转换值的工具,但是你必须知道如何使用它们。

一旦您知道如何编写可以从 PHP 调用的 C 函数,您就进入了“C/C++ 世界”,您可以在其中调用另一个 C/C++ 函数并使用 C/C++ 类型。从这里开始,就像编写纯 C/C++ 应用程序一样。好吧,直到您必须将值返回到 PHP 世界,您必须再次使用 PHP API 工具。

有一些工具可以帮助您生成所需的“胶水代码”来连接诸如 PHP 和“纯”C++ 项目之类的脚本语言,从而让您的生活更轻松。看看SWIG,这可能是最突出的例子。

【讨论】:

  • 非常感谢您的回答 :) 我在阅读的时候有点精神上的点击,我很确定我现在明白了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 2021-04-10
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
相关资源
最近更新 更多