我在github有对PHP源码更详细的注解。感兴趣的可以围观一下,给个star。PHP5.4源码注解。可以通过commit记录查看已添加的注解。
1 |
|
如果offset指定了,查找会从offset的位置开始。offset不能为负数。
返回needle第一次出现在haystack的位置。如果在haystack中找不到needle,则返回FALSE。
needle,如果needle不是字符串,它会被转换成整型数值并赋值为该数值的ASCII字符。请看下面例子。
1 |
|
1 |
|
有一点要注意的是,如果needle不是字符串的话,会调用php_needle_char函数将needle转成整型数字并转换为其ASCII值。
函数最后返回的是found,php_memnstr函数实现了查找的方法。那么再继续看看php_memnstr函数做了什么:
1 |
|
php_memnstr是函数zend_memnstr的宏定义,查看zend_memnstr函数如下:
1 |
|
第一个优化,因为(char *)memchr(p, *needle, (end-p+1)是在end – needle_len + 1(即haystack_len+1)中查找,如果p为空,说明needle的第一个字符在p中从未出现过。
1 |
|
这个函数的区分大小写的。
如果needle在haystack中不存在,返回FALSE。
如果before_needle为true,则返回haystack中needle在haystack第一次出现的位置之前的字符串。
1 |
|
strstr函数的前半部分跟strpos类似,区别在于strstr函数在找到位置后,需要返回haystack部分的字符串。part变量就是调用strstr函数时传递的before_needle变量。
1 |
|
1 |
|
1 |
|
可以知道,found是从php_stristr中得到的,继续查看php_stristr函数:
1 |
|
这个函数的功能就是将字符串都转成小写之后调用php_mennstr函数来查找needle在haystack第一次出现的位置。
因为strpos/stripos返回的是位置,位置从0开始计算,所以判断查找失败都用=== FALSE更适合。
阅读PHP的源码收获挺多,一方面可以知道某个函数的具体实现原理是怎样的,另一方面可以学习到一些编程优化方案。
到此本文结束,如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。
最后再安利一下,我在github有对PHP源码更详细的注解。感兴趣的可以围观一下,给个star。PHP5.4源码注解。可以通过commit记录查看已添加的注解。
打赏支持作者写出更多好文章,谢谢!
打赏作者
任选一种支付方式
一个正在努力的菜鸟 个人主页 · 我的文章 · 3 ·