2012-02-14 3 views
11

j'ai un fichier qui nécessite() 'espace de noms de sa, en tant que tel:PHP: Les espaces de noms dans un fichier unique avec un espace de noms global

<?php 
require_once('Beer.php'); // This file contains the Beer namespace 

$foo = new Beer\Carlsburg(); 
?> 

Je voudrais mettre l'espace de noms bière directement dans le même fichier, comme celui-ci (désoeuvrement) exemple:

<?php 
namespace Beer { 
    class Carlsburg {} 
} 

$foo = new Beer\Carlsburg(); 
?> 

Cependant, l'interpréteur PHP se plaint que No code may exist outside of namespace. Je peux donc envelopper la déclaration $foo dans un espace de noms, mais je dois aussi envelopper Beer dans cet espace de noms pour y accéder! Voici un exemple concret de ce que je suis en train d'éviter:

<?php 
namespace Main\Beer { 
    class Carlsburg {} 
} 

namespace Main { 
    $foo = new Beer\Carlsburg(); 
} 
?> 

Est-il possible d'inclure le code de l'espace de noms Beer dans le fichier, mais pas envelopper la déclaration $foo dans son propre espace de noms (congé dans l'espace de noms global)?

Merci.

+0

Vous devriez avoir Heineken comme espace de nom! – marko

Répondre

15

Vous devez utiliser l'espace de noms global:

<?php 
namespace Beer { 
    class Carlsburg {} 
} 


namespace { // global code 
    $foo = new Beer\Carlsburg(); 
} 
?> 

Voir ici ->http://php.net/manual/en/language.namespaces.definitionmultiple.php

+0

Cela ne fonctionnera que si vous écrivez '$ foo = nouveau Main \ Beer \ Carlsburg();' –

+0

@skwee oops ... désolé - mis à jour pour correspondre à la question – ManseUK

+2

Ou utilisez 'use', voir http: // stackoverflow. com/a/9274472/367456 – hakre

2

Essayez de placer une barre oblique inverse avant le nom d'espace de noms:

$beer = new \Beer\Carlsberg(); 

La barre oblique inverse initiale est traduit à « espace de noms global ». Si vous ne placez pas la barre oblique inverse, le nom de la classe est traduit dans l'espace de noms actuel.

Questions connexes