设为首页 收藏本站
查看: 464|回复: 0

[经验分享] php库的实现

[复制链接]

尚未签到

发表于 2017-3-22 08:04:11 | 显示全部楼层 |阅读模式
  php中的类和函数,以至于变量,在本质上都是C实现的, 你所编写的脚本,最终都会被转换成C代码来执行。 也许会有同学说了:不是转成opcode吗?问题是:opcode仅仅是一个中间代码,其最终还是要转成c代码来执行的。所以:php的最底层实现就是c代码。
  正是因为php的实现是用c语言来实现的,所以下载到php源码后:我们也需要./configure,make,make install这几句来编译。这是因为c是一种编译型的语言。举一个不太恰当的例子:一个程序可以被做成:gui类型,console控制台类型。对于一个控制台程序,如果我们是用c/c++这种编译型语言书写的,其要最终发布是需要先编译的。编译完生成可执行程序之后:我们只需要每次执行时传递给它各种执行所需参数即可!对于php本身你也可以这么简单的理解:拿到php源码:我们需要编译一下,生成一个类似控制台程序,而后书写php脚本时:经过lex和yacc的编译过程:其转换为各种opcode命令,而这些命令最终转换为各种参数传入这个控制台程序来进行处理! 如果这么理解的话那什么都可以理解了:
  比如说:为什么自己用c扩展实现一个php模块,为什么需要重新编译源码呢?因为这个模块是用c书写的,不编译过后根本无法执行,所以写过后需要将其放到php源码中,然后整个对包含这部分函数的php源码进行编译,生成可以执行的类似控制台程序。这样他就可以使用该模块中的函数了。
  其实php扩展没有上边说的这么简单,但是大致原理差不多。关键是要记住一点:所有php底层实现本质上都是c语言!!既然是c,那要运行之前必然需要先先编译了。
  (下边这段是我揣测的,没有任何依据)
  那按照我的理解,php在编译阶段过后生成了各种opcode命令,一共有150种。而后需要执行命令分发过程到各个命令处理器上。那这各个命令处理器我们可以逻辑上认为是一个个的控制台可执行程序。从而每次执行一个php脚本时:先用c函数来对php语句执行编译,生成op_array.而后再将之分发给各个命令处理器来进行处理!
  ---------------------------------------------------------------------------------------------------------------------------------------------------
  那现在的问题就是:
  1:php语言怎么转成各种opcode的?
  2:底层用c如何写php扩展?原理是什么?
  问题1中的关键是:顶层的php是一种弱类型的语言,但是其底层实现是c语言,为强类型。 那弱类型是如何转成强类型的呢?这些下一篇博文再来解释。
  (补充:对于在一个文件A中include/require另外一个文件B的查找顺序:
  1:对于c/c++而言:是先在文件A的所在目录中查找,而后再去include_path中查找。
  2:对于php而言:则恰恰相反,是先在include_path中查找,而后再去include_path中查找。
  切记这两种查找方式的不同,不然在不同目录下编写两个同名文件时容易混淆到底是包含了哪一个进来···!)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-353256-1-1.html 上篇帖子: PHP开源框架22个 下篇帖子: PHP基础006: PHP的常量变量总结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表