2016-10-12 47 views
3

這工作:爲什麼我會得到PHP致命錯誤:未捕獲錯誤:未找到類'MyClass'?

class MyClass { 
    public $prop = 'hi'; 
} 

class Container { 
    static protected $registry = []; 
    public static function get($key){ 
     if(!array_key_exists($key, static::$registry)){ 
      static::$registry[$key] = new $key; 
     } 
     return static::$registry[$key]; 
    } 
} 

$obj = Container::get('MyClass'); 
echo $obj->prop; 
​​

但是,當我試圖打破它爲單獨的文件,我得到一個錯誤。

PHP Fatal error: Uncaught Error: Class 'MyClass' not found in /nstest/src/Container.php:9

這是9號線:

static::$registry[$key] = new $key; 

什麼是瘋狂的是,我可以硬編碼它,和它的作品,所以我知道的命名空間是正確的。

static::$registry[$key] = new MyClass; 
​​

很顯然,我不想硬編碼它,因爲我需要動態值。我也試過:

$key = $key::class; 
static::$registry[$key] = new $key; 

但是,這給了我這個錯誤:

PHP Fatal error: Dynamic class names are not allowed in compile-time ::class fetch

我不知所措。 Clone these files to reproduce

. 
├── composer.json 
├── main.php 
├── src 
│   ├── Container.php 
│   └── MyClass.php 
├── vendor 
│   └── ... 
└── works.php 

不要忘記自動裝載機。

composer dumpautoload 

composer.json
{ 
    "autoload": { 
     "psr-4": { 
      "scratchers\\nstest\\": "src/" 
     } 
    } 
} 

main.php
require __DIR__.'/vendor/autoload.php'; 
use scratchers\nstest\Container; 

$obj = Container::get('MyClass'); 
echo $obj->prop; 

SRC/Container.php

namespace scratchers\nstest; 

class Container { 
    static protected $registry = []; 
    public static function get($key){ 
     if(!array_key_exists($key, static::$registry)){ 
      static::$registry[$key] = new $key; 
     } 
     return static::$registry[$key]; 
    } 
} 

SRC/MyClass.php

namespace scratchers\nstest; 

class MyClass { 
    public $prop = 'hi'; 
} 
+0

'新ClassName'查找相對於當前的命名空間,'新的$ classname'不類。 – tkausl

+0

@tkausl嗯,這是有道理的,那麼解決方案是什麼? –

+0

在變量中使用完整的類名稱(即'\ scratchers \ nstest \ MyClass')或更好的'MyClass :: class'(它會生成完整的類名) – tkausl

回答

4

Thanks to @tkausl,我能夠通過傳遞完全限定名作爲變量來解決動態相對命名空間問題。

require __DIR__.'/vendor/autoload.php'; 
use scratchers\nstest\Container; 
use scratchers\nstest\MyClass; 

$obj = Container::get(MyClass::class); 
echo $obj->prop; 
​​
+0

此外,請確保您的使用說明大寫或小寫字母有所作爲。 – prosti

+0

@prosti其實類名在php中不區分大小寫https://stackoverflow.com/a/33273959/4233593 –

相關問題