這工作:爲什麼我會得到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';
}
'新ClassName'查找相對於當前的命名空間,'新的$ classname'不類。 – tkausl
@tkausl嗯,這是有道理的,那麼解決方案是什麼? –
在變量中使用完整的類名稱(即'\ scratchers \ nstest \ MyClass')或更好的'MyClass :: class'(它會生成完整的類名) – tkausl