目录结构以下php
myfolder a.txt [myfolder] a.txt
代码:linux
$files = glob('myfolder/a.txt'); var_dump($files); $files = glob('[myfolder]/a.txt'); var_dump($files); //[]在使用中须要转义 $files = glob('\[myfolder\]/a.txt'); var_dump($files);
windows下输出git
test.php:7: array(1) { [0] => string(14) "myfolder/a.txt" } test.php:14: array(0) { } test.php:21: array(0) { }
linux下输出github
test.php:7: array(1) { [0]=> string(14) "myfolder/a.txt" } test.php:14: array(0) { } test.php:21: array(1) { [0]=> string(16) "[myfolder]/a.txt" }
无论是windows仍是linux,[]
在目录中都是正常字符c#
为何windows下就匹配不出来呢?windows
咱们去看php源码ui
查找PHP_FUNCTION(glob),操作系统
找到关键代码命令行
PHP_FUNCTION(glob) { ... if (0 != (ret = glob(pattern, flags & GLOB_FLAGMASK, NULL, &globbuf))) { ... }
继续查找glob方法的定义翻译
#ifndef PHP_WIN32 #include <glob.h> #else #include "win32/glob.h" #endif
从这咱们看出,glob
方法在windows和linux中是用的2套方法,在linux中用的是linux底层的方法。
咱们再去win32/glob.c下看代码
找到了下面这几行关键代码
... #ifdef PHP_WIN32 /* Force skipping escape sequences on windows * due to the ambiguity with path backslashes */ flags |= GLOB_NOESCAPE; #endif ...
翻译下大体意思是,因为windows下目录的路径正反斜杠混用,因此强制不转义
也就是说windows下,使用glob
方法就算你用了反斜杠也不会转义。
啊,问题终于找到了!!!
彩蛋来了
那么为何windows用反斜杠作路径呢?
由于windows前身是ms-dos系统。
dos1时尚未目录结构的概念,而且当时微软的开发人员有 DEC 的背景,DEC 的操做系统上是用 / 作命令行参数分割符。
到了dos2.0时代,系统新增了目录结构概念,可是 / 已经被用了,因此只能换一个喽,因而微软用反斜杠作了目录路径的分隔符。