2017-07-24 71 views
0

我想在使用縮短命名空間路徑的同時創建一個帶有參數的對象以加載函數。它是這樣,創建具有變量類名稱和名稱空間的對象

use Com\Core\Service\Impl as Impl; 

    class Load { 
     public static function service(String $class, array $params = array()){ 
      try { 
       $ucfirstclass = ucfirst($class); 
       if (interface_exists('\\Com\\Core\\Service\\' . $ucfirstclass)) { 
        $ref = "Impl\\".$ucfirstclass; 
        return new $ref(); 
       } else { 
        throw new Exception("Service with name $class not found"); 
       } 
      } catch (\Throwable $ex) { 
       echo $ex->getMessage(); 
      } 
     } 
    } 

在呼籲像,

$userService = Load::service("user"); 

它拋出一個異常

Class 'Impl\User' not found 

雖然它會正常工作,如果我只是取代 「默認地將Impl」使用完整路徑「Com \ Core \ Service \ Impl」實現Load :: service()內部的實現。

我是新來的。有人可以幫助我,爲什麼我不能使用縮短路徑「Com \ Core \ Service \ Impl as Impl」?

回答

1

同時使用縮短它的命名空間路徑。

沒有「短命名空間」這樣的事情。命名空間或類由它的完整路徑決定,從根命名空間開始。

use Com\Core\Service\Impl as Impl; 

在上面的代碼片段Implclass or namespace alias。別名在編譯時解析,並且僅在聲明它的文件中有效。

在運行期間不能使用別名。在運行時引用類名的唯一方法是生成其絕對路徑(從根名稱空間開始)。
你已經發現了這個。

查看更多about namespace aliases/importing

+0

有道理。感謝您的解釋。 – nks

0

當將類名稱作爲string s時,您始終必須使用完全限定的類名稱。

試試這個:

$ucfirstclass = ucfirst($class); 

if (interface_exists('Com\\Core\\Service\\' . $ucfirstclass)) { 
    $ref = 'Com\\Core\\Service\\Impl\\' .$ucfirstclass; 

    return new $ref(); 
} 

僅供參考,請參閱:

相關問題