PHP扩展与库的区别(是否可以转换)

8
一些php wamp/lamp软件包中包含了像php_amf、php_db和php_gd2等php扩展,我只需要激活扩展或者在默认情况下安装扩展即可。一般来说,我的问题是这些扩展与库有什么不同?具体来说,我想知道一个扩展是否可以转化为项目本身加载的库,以便无需像php扩展那样进行特殊安装即可调用该库。有时候在共享主机上,你没有足够的权限来安装新的扩展。

可能是http://stackoverflow.com/questions/1567605/php-extension-vs-library-vs-class-when-and-why的重复问题。 - Shakti Singh
1
@Shakti 感谢提供链接,但是另一个问题并没有明确解决转换问题。这才是我最感兴趣的。 - sami
3个回答

13

PHP扩展是一个C或C++程序,包装在Zend引擎周围,在PHP安装中提供PHP函数和类。

PHP库是使用本地PHP编写的程序,可以使用扩展来提供PHP程序内的函数和类,也可能不使用扩展。

虽然将一个PHP库转换为扩展是可能的,而且相对容易(假设您有足够的C++知识),但相反的过程可能会很繁琐,因为C++程序可能使用PHP中没有的函数和对象。

将PHP库转换为扩展更容易,因为显然PHP函数都可以以某种方式在C中使用,因为PHP是用C编写的。然而,相反并非总是如此。


+1 但我更想了解将扩展转换为库的问题。您对此有具体的评论吗? - sami
但我认为PHP是一种图灵完备语言,这意味着在C(或任何语言)中完成的任何事情,PHP也可以做。 - sami
@sami:我并没有说PHP不能做到,我只是说它很繁琐。例如,在C++中,你有类之间的友元关系、多重继承、常量参数和返回值等概念,而这些在PHP中都没有。虽然可以模拟这些东西,但这并不像重命名一个函数或者改变几个参数那么容易。有些改动需要改变程序设计。另一方面,C++语言支持几乎所有PHP语言特性。 - netcoder

4
一个 PHP 扩展是用另一种语言(通常是 C 或 C++)编写的,它扩展了 PHP 的功能,使其能够完成在实践中无法通过 PHP 内置函数实现的任务。例如,直接与操作系统或 Web 服务器进行交互,而这些功能并没有被 PHP 内置函数支持。扩展还允许从 PHP 中重用其他语言编写的现有代码;即使该库理论上可以用 PHP 重新编写,但重新使用代码往往更加实用,并且可以用更少的工作量获得更多的功能,同时允许将来的更新轻松地整合到代码中。
一个 PHP 库只是一组共享的 PHP 代码集合,因此虽然它允许代码被多个开发者重用,但它并不能实现任何你自己不能(理论上)用 PHP 代码编写的功能。
关于将扩展转换为库:这取决于扩展的功能。如果可以使用原始的 PHP 实现,那么你可以将其转换,但这几乎等于对功能进行了完全重写。这可能会使代码变慢。

1
可能他们不喜欢我从netcoder复制答案的事实,但是这两个答案是在30秒内发布的。如果我已经完成了90%的答案,另一个答案进来了,我通常会继续打完我的答案而不是放弃。 - Tim Martin
PHP如何在没有扩展的帮助下进行原始内存访问?调用C/C++函数,而PHP标准库中不存在其包装器?实例化C++类? - Tim Martin
@Billy ONeal 这意味着扩展可以转换为库吗? - sami
@Tim: 我的意思是:“不可能”是一个强烈的词。您可以在PHP中复制用户模式C或C++库所能做的任何事情(内核模式是另一回事;PHP没有方法与汇编语言或CPU指令交互)。只是鉴于已经有很多用C或C ++编写的功能,自然的公开这些功能的方式是通过扩展,因此这种方法并不是很实用。 - Billy ONeal
@Tim,有趣的是你提到了图灵完备性,我刚刚写完了一条评论关于这个。 - sami
显示剩余6条评论

2

扩展能转换成库吗?

不可以自动转换。扩展不是用PHP编写的,因此无法简单地转换。当然,可以编写执行等效操作的PHP脚本,但是与原始扩展相比,这样的脚本会明显较慢,因为与本地/编译语言相比,PHP在计算方面相对低效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接