当前位置:Gxlcms > PHP教程 > php数组键名直接使用目录名VSmd5(目录名)?

php数组键名直接使用目录名VSmd5(目录名)?

时间:2021-07-01 10:21:17 帮助过:17人阅读

static $funcs = array();
... ...
$key = md5($path);
if (isset($funcs[$key])) return true;
if (file_exists(PC_PATH.$path)) {
    include PC_PATH.$path;
} else {
    $funcs[$key] = false;
    return false;
}
$funcs[$key] = true;
return true;

上述代码是对include_once的优化,在每次include $file的时候都将$file放入$funcs中,避免重复导入。
那么问题是:$key = md5($path);是什么依据,感觉这么做没什么意义。

回复内容:

static $funcs = array();
... ...
$key = md5($path);
if (isset($funcs[$key])) return true;
if (file_exists(PC_PATH.$path)) {
    include PC_PATH.$path;
} else {
    $funcs[$key] = false;
    return false;
}
$funcs[$key] = true;
return true;

上述代码是对include_once的优化,在每次include $file的时候都将$file放入$funcs中,避免重复导入。
那么问题是:$key = md5($path);是什么依据,感觉这么做没什么意义。

首先我觉得这么做是没意义的,不会比直接用 include_once 更好。

然后这是一个比较常见的设计(虽然我觉得在这里没有什么意义),在需要通过 key 来查找 value 时,如果没有获取 key 的需要,那么可以将 key 散列之后作为 key, 这样可以:

  • 避免因为 key 含有特殊的字符,或者为空造成一些诡异的错误
  • 避免因为 key 很长而占用大量的内存

  1. 存储上考虑,md5值整齐,长度一致,path可能会很长
  2. ~~效率上考虑,path很可能前面很长一段都是一样的,比如../../lib/service/database/...,而md5值比较离散,一般比较开头1~2个字符就可以确定是否不同~~

谢楼下指正,第2点描述不正确。翻了下源码,array内部确实对key已经有了hash操作,所以这里多一次md5的hash没有太大必要

md5一下再存没必要。PHP的数组就是个黑洞级哈希表,什么都能往里塞。 你无论输入什么,key都会首先被哈希一发,所以不需要你提前处理。

人气教程排行