多语言展示
当前在线:1515今日阅读:181今日分享:30

discuz 函数return_bytes源码分析

位置(根路径\source\function\function_core.php)。返回字节数。这个函数比较简单,知道换算规则就可以设计算法了。在上传文件的时候,经常用到,文件大小比对。换算规则:1G=1024M=1024*1024K=1024*1024*1024B。这种换算规则和传统的规则不同,传统的都是都是整数的倍数。如1米等于100厘米。而此种换算规则是基于2的次方,如1G=2^10M。B 字节,KB 千字节,MB 兆,GB 吉兆,TB 太兆。function return_bytes($val) {     $val = trim($val);    $last = strtolower($val{strlen($val)-1});    switch($last) {        case 'g': $val *= 1024;        case 'm': $val *= 1024;        case 'k': $val *= 1024;    }    return $val;}
工具/原料

discuz

方法/步骤
1

$val = trim($val);       $val去掉首尾两边空格,再赋值给$val,这句检查很有必要,有空格会造成结果错误。

2

$last = strtolower($val{strlen($val)-1});       strlen($val)-1字符串总长度减一。$val{strlen($val)-1}这句比较有意思,和函数substr功能类似。不过小编更喜欢substr,因为这样更容易理解。strtolower字符串转换成小写。若$val=’123M’,执行这句返回$last=’m’。

3

switch($last) {   case 'g': $val *= 1024;   case 'm': $val *= 1024;   case 'k': $val *= 1024;}       switch没有break中断。这样有他独特的特点。如$last=’m’,执行从第二个case开始,然后执行第三个case。设计挺巧妙的,单位从大到小,不过也有那么一兜兜难理解。记得小编刚开始编程时候用的是if,每个if对应一个换算彼此木有关系。

4

那么问题来了,只能处理G,M,K,还有T没处理。如果传入T,从代码上看被当做G处理有了,BUG哟。

推荐信息