2016-10-12 5 views
3

Dies funktioniert:Warum bekomme ich PHP Fatal error: Uncaught Error: Klasse 'MyClass' nicht gefunden?

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; 

hi

Aber wenn ich versuche, es in einzelne Dateien zu durchbrechen, erhalte ich einen Fehler.

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

Dies ist Zeile 9:

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

Was verrückt ist, dass ich es schwer codieren können, und es funktioniert, so dass ich weiß, dass der Namespace korrekt ist.

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

hi

Offensichtlich möchte ich nicht zu hart Code, weil ich dynamische Werte benötigen. Ich habe auch versucht:

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

Aber das gibt mir diese Fehlermeldung:

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

ich ratlos bin. Clone these files to reproduce:

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

Vergessen Sie nicht den Autoloader.

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

'neuer ClassName' sucht die Klasse in Bezug auf den aktuellen Namespace,' neuer $ classname' nicht. – tkausl

+0

@tkausl hmm das macht Sinn, also was ist die Lösung? –

+0

Verwenden Sie den vollständigen Klassennamen in Ihrer Variablen (zB '\ scratchers \ nstest \ MyClass') oder besser' MyClass :: class' (was den vollständigen Klassennamen ergibt) – tkausl

Antwort

4

Thanks to @tkausl konnte ich dynamischen relativen Namespacing umgehen, indem ich den voll qualifizierten Namen als Variable übergab.

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

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

hi

+0

Auch, stellen Sie sicher, dass Ihre Verwendung Aussage Kapital oder Kleinbuchstaben den Unterschied machen. – prosti

+0

@prosti Klassennamen sind in php https://stackoverflow.com/a/33273959/4233593 eigentlich keine Groß-/Kleinschreibung –

Verwandte Themen