php源码哪里找,如何查找php核心函数源码

初衷

有时候我们会遇到对php提供的函数执行结果感到诧异,这时候我们需要看下源码的实现,才能做出更好的解释。

代码结构

首先在php.net官网下载php源码。

下载好的源码,我们需要重点关注的是ext和zend两个目录。其他目录可以不用关心。

0818b9ca8b590ca3270a3433284dd417.png

ext目录下放的是php里面的扩展。包括我们经常使用的一些核心函数(json_encode、json_decode),同时也包括mysqli、PDO等核心类。

zend目录下放的是zend引擎的源码。控制PHP代码运行时候的运行环境。它处理PHP提供的所有“语言层”的特性,包括:变量,表达式,语法解析,代码执行和错误处理。

如何查找源码

假设我们想知道json_encode怎么实现,只需在整个目录中搜索 _function(json_encode)。就可以发现json_encode的源码是在json.c文件中的。

0818b9ca8b590ca3270a3433284dd417.png

同理找strlen方法。

0818b9ca8b590ca3270a3433284dd417.png

仔细看就会发现,两个搜索结果略有差异。 一个是PHP_FUNCTION,一个是ZEND_FUNCTION。一个是zend引擎定义的函数,一个是PHP扩展的函数。

在json.c文件中,可以很轻松找出json_encode的实现代码如下。

/* {{{ proto string json_encode(mixed data [, int options[, int depth]])

Returns the JSON representation of a value */

static PHP_FUNCTION(json_encode)

{

zval *parameter;

smart_str buf = {0};

zend_long options = 0;

zend_long depth = PHP_JSON_PARSER_DEFAULT_DEPTH;

if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|ll", &parameter, &options, &depth) == FAILURE) {

return;

}

JSON_G(error_code) = PHP_JSON_ERROR_NONE;

JSON_G(encode_max_depth) = (int)depth;

php_json_encode(&buf, parameter, (int)options);

if (JSON_G(error_code) != PHP_JSON_ERROR_NONE && !(options & PHP_JSON_PARTIAL_OUTPUT_ON_ERROR)) {

smart_str_free(&buf);

ZVAL_FALSE(return_value);

} else {

smart_str_0(&buf); /* copy? */

ZVAL_NEW_STR(return_value, buf.s);

}

}

/* }}} */

剩下的就是要读懂这段代码,后面再讲……o(╯□╰)o

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值