这行代码的作用不理解[php]

2014-12-05 16:25:24 +08:00
 jacob
str_replace('\\', DIRECTORY_SEPARATOR, trim($class,'\\'));


$class里的\\都被去掉了,然后再替换成目录分隔符,意义何在?再说了,类名怎么会有\\这种东西呢?

百思不得其解啊.
2531 次点击
所在节点    问与答
11 条回复
superbear
2014-12-05 16:33:08 +08:00
trim只是去除首位处的字符
superbear
2014-12-05 16:36:11 +08:00
\(转义)\表示\,
使用了namespace的话,类名就会有这个\
hjxx
2014-12-05 16:55:48 +08:00
去除首尾。
shiny
2014-12-05 17:03:17 +08:00
带 namespace 的类名可能以 \ 开头,所以去掉,然后把中间分隔的 \ 替换成目录分隔符。
这代码像是 autoload 里的,下一步我猜就是去指定的路径找文件了。
jacob
2014-12-05 17:23:21 +08:00
@superbear
@hjxx
@shiny

这个确实是一个autoload里的代码,trim是去除首尾的,熊兄可能大意了,带namespace的确实有正斜杠,那么是不是应该把斜杠和命名空间的名字都去掉,只留下类名再查找文件啊.

但是这行代码也没有去掉namespace的名字,代码其他部分也没有,带着namespace名字查文件是不可能的吧,那样类名没法起啊,因为spl_autoload_register传参数时会把相关的namespace名字都传过去.

而且 namespace的斜杠最后会在字符串中间部分,左边是namespace名字,最后是类名,首尾是没斜杠的有,还是想不通啊
viowan
2014-12-05 17:28:53 +08:00
@jacob 我猜可能是$class是一个具体文件的路径地址?然后把\\这种的写法,替换成当前系统上的路径分隔符(用于兼容)
osinx
2014-12-05 17:29:07 +08:00
看了下回复,上面说的都很好,只是缺少画龙点晴的回复。

其实这个写法是籽兼容windows。
因为windows下的path_sep是"\"
shiny
2014-12-05 17:37:43 +08:00
@osinx 我觉得是将每一层 namespace 对应文件夹名字,而 \ 是 namespace 的分隔字符。
shiny
2014-12-05 17:40:38 +08:00
@jacob namespace 有钟写法是以 \ 开头,请搜索手册查看 namespace 部分章节,trim 显然是为这种情况考虑。

一层 namespace 就是一个文件夹, namespace 分隔字符替换成 DIRECTORY_SEPARATOR,然后文件放指定目录里就行了。


如果你考虑自己实现一个「优雅」的 autoload 机制,这种是一种比较不错的方式。
66beta
2014-12-05 17:41:16 +08:00
万网虚拟主机上用trim会空白页面
jacob
2014-12-05 18:51:07 +08:00
@shiny
@osinx
@viowan


我严重怀疑代码有错误,代码里有

$flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE;

但是却没有preg_split, 这不是坑爹吗,肯定缺少preg_split把类名分离出来的代码.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/151766

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX