2016-03-28 1 views
1

Je suis un peu confus au sujet de l'utilisation des espaces de noms en php, essaieraient d'expliquer à l'aide du problème que j'ai avec l'un de mes projetsespaces de noms en php

J'ai une classe sous un espace de noms comme

namespace BigBlueButton; 
class BigBlueButton 
{ 
    public function createMeeting($createMeetingParams, $xml = '') 
    { 
     //some code 

     return new CreateMeetingResponse($xml); 
    } 
} 

Je l'utilise comme

use \BigBlueButton; 
    $bbb = new BigBlueButton\BigBlueButton(); 

//then I try to reference the variable $bbb in a function but I can't 

    function easymeet_create_meeting($id) { 


// $bbb = new BigBlueButton\BigBlueButton(); I don't want to create a new object here but reference the object I created above,something like this 
     $bbb=BigBlueButton\bbb; 
} 

mais je ne peux pas sembler accéder à la variable ci-dessus à savoir bbb $, j'ai essayé global $bbb, mais $bbb ne semble pas être dans l'espace de noms global, je sous Je suis suis en train d'accéder à un bbb $ constant dans le code ci-dessus, mais je l'ai montré de toute façon de dire ce que je suis en train de faire

+0

BigBlueButton \ bbb est pas une variable.c'est une référence d'espace de noms ... –

Répondre

0

Si je comprends bien le problème est pas avec espace de noms.

Comme vous dit que vous pouvez essayer d'utiliser une variable globale par exemple:

use \BigBlueButton; 
global $bbb; 
$bbb = new BigBlueButton\BigBlueButton(); 

function easymeet_create_meeting($id) { 
    global $bbb; 
    // you can use it 
} 

ou vous pouvez envoyer la variable à la fonction

function easymeet_create_meeting($id, $bbb) { 

} 

Je ne sais pas tout le problème, mais vous pourrait également utiliser un modèle de conception singleton dans la classe afin que vous obtenez toujours la même instance chaque fois que vous l'utilisez.

2

Les espaces de noms ne couvre pas les variables telles que:

Dans le monde PHP, namespaces sont conçus pour résoudre deux problèmes auteurs des bibliothèques et des applications rencontrent lors de la création éléments de code réutilisables tels que les classes ou fonctions:

  1. collisions de noms entre le code que vous créez, et des classes PHP internes/fonctions/constantes ou tiers classes/fonctions/constantes.
  2. Capacité d'alias (ou réduire) Extra_Long_Names conçus pour atténuer le premier problème, l'amélioration de la lisibilité du code source.

http://php.net/manual/en/language.namespaces.rationale.php

Votre déclaration de classe est très bien, mais vous avez mal utilisé le mot-clé use comme il doit se référer à des classes spécifiques, et non pas un espace de noms.

use \BigBlueButton\BigBlueButton; 

function easymeet_create_meeting($id, BigBlueButton $bbb) { 
    /* ... */ 
} 

$bbb = new BigBlueButton(); 
$result = easymeet_create_meeting(1234, $bbb); 

Vous remarquerez que je suis également déplacé $bbb dans les paramètres de la fonction parce que global state is the devil. Il est également type-hinted parce pourquoi pas?

Mieux encore:

class BigBlueButton implements ButtonInterface {} 
class BigRedButton implements ButtonInterface {} 

Et:

function easymeet_create_meeting($id, ButtonInterface $bbb) {} 
$result[] = easymeet_create_meeting(1234, new BigBlueButton()); 
$result[] = easymeet_create_meeting(5678, new BigRedButton()); 

Et maintenant, nous examinons les rudiments de Dependency Injection, ce qui est une bonne habitude à prendre.