V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
jacob
V2EX  ›  问与答

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

  •  
  •   jacob · 2014-12-05 16:25:24 +08:00 · 2396 次点击
    这是一个创建于 3438 天前的主题,其中的信息可能已经有所发展或是发生改变。
    str_replace('\\', DIRECTORY_SEPARATOR, trim($class,'\\'));


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

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

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

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

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

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

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


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


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

    $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE;

    但是却没有preg_split, 这不是坑爹吗,肯定缺少preg_split把类名分离出来的代码.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1002 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:28 · PVG 02:28 · LAX 11:28 · JFK 14:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.