2014-12-05 25 views
1

這些代碼是從書< <專業的PHP MVC >>複製,我覺得他們錯過了一些線條,有PHP SPL自動加載寄存器問題

$flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE; 

但沒有使preg_split

和我想不通行

$file = strtolower(str_replace("\\", DIRECTORY_SEPARATOR, trim($class, "\\"))).".php"; 

它trimed 雙反斜槓先試試取代雙反斜槓DIRECTORY_SEPARATOR,怎麼?

它會有什麼情況雙反斜槓在類名?

代碼:

= ------

function autoload($class) 
{ 
    $paths = explode(PATH_SEPARATOR, get_include_path()); 

    $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE; 
    $file = strtolower(str_replace("\\", DIRECTORY_SEPARATOR, trim($class, "\\"))).".php"; 

    foreach ($paths as $path) 
    { 
     $combined = $path.DIRECTORY_SEPARATOR.$file; 

     if (file_exists($combined)) 
     { 
      include($combined); 
      return; 
     } 
    } 

    throw new Exception("{$class} not found"); 
} 

class Autoloader 
{ 
    public static function autoload($class) 
    { 
     autoload($class); 
    } 

} 

spl_autoload_register('autoload'); 
spl_autoload_register(array('autoloader', 'autoload')); 
+0

這些是反斜槓,而不是正斜槓。在第一個例子中,你有三個反斜槓,第二個例子中有兩個反斜槓。哪個是對的?第一個反斜槓在任何情況下都是[轉義字符](http://php.net/manual/en/regexp.reference.escape.php)。 – jurgemaister 2014-12-05 11:20:33

回答

1

在PHP命名空間是用反斜槓delimitered,你可以在documentation看到:

$ C = new \ my \ name \ MyClass; //見「全球空間」部分

當你看到這個模式使用2個反斜槓,這是因爲反彈本身具有特殊的意義,即作爲轉義字符,你可以再次在documentation見。

特別是,如果要匹配反斜槓,請寫「\\」。

所以,爲了匹配反斜槓,你需要將它轉義出來,最後加上兩個反斜槓。

+0

我更正了拼寫錯誤。謝謝,這些代碼是否錯過preg_split? – wolfrevo 2014-12-05 11:33:23

+0

你是什麼意思?另外,您的$ flags變量未被使用。 – jurgemaister 2014-12-05 11:36:43

+0

是的,我想知道爲什麼不使用$標誌。 PREG_SPLIT_NO_EMPTY用於preg_split,所以我認爲這些代碼錯過了preg_split。 – wolfrevo 2014-12-05 11:51:44

1

帶有$標誌的行很可能是從之前他們編寫類加載器的方式遺留下來的,並且被忘記刪除。

反斜槓(!)實際上並不是雙倍。在PHP和許多其他語言中,反斜線功能是一種轉義字符。例如,你可以寫在報價有限的字符串引號,像這樣:

$someString = "Hello, so called \"World\"!"; 

沒有結束的字符串,並導致解析錯誤的行的其餘部分世界前報價。

但要將轉義字符寫入字符串,必須將其自身轉義。所以你實際上只有一個反斜槓。

使用DIRECTORY_SEPARATOR(\在Windows上,/在Linux/Unix上)替換反斜槓是一種以非常類似於Java包的方式組織代碼的便捷方式。

反斜槓在PHP中表示命名空間,所以你的類可能是這樣的:

\jacob\someproject\SomeClass 

完成替換操作和(在Linux上),你可以映射到一個相對路徑:

jacob/someproject/someclass.php 

我個人會刪除strtolower,所以你可以保留駱駝案件的文件名:

jacob\someproject\SomeClass.php