これは動作します: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