2016-10-12 19 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 –

関連する問題