php语法怎么输入一串字符,PHP 语法字符串函数 strcmp、strlen 使用及实现

说明

这里基于 PHP7.2.5 进行测试,PHP7 之后内部结构变化应该不是太大,但与 PHP5.X 有差别。

say();

function say()

{

echo "周杰伦";

}

PHP hello.PHP

周杰伦

cli 模式下我们执行这个代码之后就会输出函数调用的结果,简单来说这个过程经历了下面的步骤

8e4e9eac6b335a427abaaa720c0f8f1c.png

我们可以先理解为要经历编译、执行两步。也就是我们每次执行这段代码都要经历这样的一个过程。

内置函数

也就是我们在手册中看到的函数,太多了,这里我们用字符串函数来举例说明。与用户自定义函数不同,内置函数不需要经历编译,直接定义注册就可以。

0bf250bd8c68bf046ba0fe21c7298077.png

所以内置函数的效率相对是高一些。

函数如何实现的

strlen

strlen("hello"); // 这个语法不说了,返回字符串长度

// 看一下具体实现

// Zend/zend_builtin_functions.c

ZEND_FUNCTION(strlen) // 定义函数 strlen是函数名

{

zend_string *s; // 这是参数字符串

ZEND_PARSE_PARAMETERS_START(1,1)

Z_PARAM_STR(s)

ZEND_PARSE_PARAMETERS_END();

// 主要看这里 给返回值设置的是 s的长度

RETVAL_LONG(ZSTR_LEN(s));

}

// 来看下ZSTR_LEN是啥

// zend_string.h

// 很巧返回的是zend_value.zend_string.len 记得吗

#define ZSTR_LEN(zstr) (zstr)->len

// RETVAL_LONG 函数 给返回值赋值也就是 len 字符串的长度,并把返回值的类型设置为 IS_LONG

小结

可以看到 strlen 其实是直接获取了 zval.zend_value.zend_string.len,最后一步是把 len 赋值给函数返回值。

这里需要说明的是:

ZEND_FUNCTION 是函数声明的通用格式,知道就行。

函数返回值也是一个变量,函数执行完返回它。

strcmp

strcmp($str1,$str2);

//这个函数是比较两个字符串的大小,如果str1>str2则大于0,如果str1

strcmp("ha","h");// 1 多一个字符

strcmp("ha","hA");// 32 这个32是咋来的呢,实际上如果字符数量相等则比较第二个字符的ASII值,看下面

echo ord("A"); // 65

echo PHP_EOL;

echo ord("a"); // 97

// 来看实现

// 定义函数

ZEND_FUNCTION(strcmp)

{

// 参数 s1=ha,s2=h

zend_string *s1,*s2;

// 这里设置参数

ZEND_PARSE_PARAMETERS_START(2,2)

Z_PARAM_STR(s1)

Z_PARAM_STR(s2)

ZEND_PARSE_PARAMETERS_END();

// 这里进行比较, 调用zend_binary_strcmp进行比较

// 参数为s1的值也就是ha,s1的长度也就是2,s2的值h,s2的长度 1

// ZEND_LEN就是返回s2的长度,看上面的内容

RETURN_LONG(zend_binary_strcmp(ZSTR_VAL(s1),ZSTR_LEN(s1),ZSTR_VAL(s2),ZSTR_LEN(s2)));

}

// 来看zend_binary_strcmp

ZEND_API int ZEND_FASTCALL zend_binary_strcmp(const char *s1,size_t len1,const char *s2,size_t len2) /* {{{ */

{

// 返回值

int retval;

// 如果完全相等就是0, == 在任何语言都适合

if (s1 == s2) {

return 0;

}

// 调用c内置函数memcmp比较

// min(len1,len2) 是获取最短的那个长度

// 如min("ha","h") 就比较前1个字符

retval = memcmp(s1,s2,MIN(len1,len2));

// 如果=0则再min长度内是相等的,返回值就是哪个长就返回多出来的字符数

if (!retval) {

return (int)(len1 - len2);

} else {

// 如果<>0,则就返回那个值

return retval;

}

}

// 关于memcmp 在c官方手册看到,比较两个字符串,s1>s2返回大于0,s1

// 参考

// 就是把每个字符都比较一遍

int memcmp(const void *s1,const void *s2,size_t n){

const unsigned char *su1,*su2;

for(su1 = s1,su2 = s2; 0 < n; ++su1,++su2,--n)

if(*su1 != *su2)

return ((*su1 < *su2) ? -1 : +1);

return 0;

}

小结

strcmp 的实现是基于 C 内置函数 memcmp 实现的,规则就是 memcmp 的语法。

总结

内置函数不需要经历编译过程,执行速度比自定义函数要快,实现上跟我们写 PHP 代码是一样的,也要定义、调用等步骤。

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值