2017-07-24 3 views
0

J'essaie de créer un objet avec un paramètre à la fonction de chargeur tout en utilisant un chemin d'espace de noms raccourci. Il va comme,Créer un objet avec un nom de classe de variable et un espace de noms

use Com\Core\Service\Impl as Impl; 

    class Load { 
     public static function service(String $class, array $params = array()){ 
      try { 
       $ucfirstclass = ucfirst($class); 
       if (interface_exists('\\Com\\Core\\Service\\' . $ucfirstclass)) { 
        $ref = "Impl\\".$ucfirstclass; 
        return new $ref(); 
       } else { 
        throw new Exception("Service with name $class not found"); 
       } 
      } catch (\Throwable $ex) { 
       echo $ex->getMessage(); 
      } 
     } 
    } 

Tout en appelant comme,

$userService = Load::service("user"); 

il jette une exception

Class 'Impl\User' not found 

Bien que ça va marcher très bien si je vais juste remplacer "Impl" dans l'implémentation Load :: service() avec le chemin complet "Com \ Core \ Service \ Impl".

Je suis nouveau avec ça. Quelqu'un peut-il aider ici pourquoi ne puis-je pas utiliser raccourcir le chemin "Com \ Core \ Service \ Impl comme Impl"?

Répondre

1

tout en utilisant l'espace de noms raccourcir chemin en elle.

Il n'existe pas de "short namespace". Un espace de noms ou une classe est déterminé par son chemin complet, à partir de l'espace de noms racine.

use Com\Core\Service\Impl as Impl; 

Impl dans le fragment de code ci-dessus est un class or namespace alias. Un alias est résolu à la compilation et il n'est valide que dans le fichier où il est déclaré.

Il n'est pas possible d'utiliser un alias pendant l'exécution. La seule façon de faire référence à un nom de classe pendant l'exécution consiste à générer son chemin absolu (à partir de l'espace de noms racine).
Vous l'avez déjà découvert.

En savoir plus sur namespace aliases/importing.

+0

Fait sens. Merci pour l'explication. – nks

0

Lorsque vous faites référence à des noms de classe comme string s, vous devez toujours utiliser le nom de classe complet.

Essayez ceci:

$ucfirstclass = ucfirst($class); 

if (interface_exists('Com\\Core\\Service\\' . $ucfirstclass)) { 
    $ref = 'Com\\Core\\Service\\Impl\\' .$ucfirstclass; 

    return new $ref(); 
} 

Pour référence, voir: