2010-02-11 4 views
2

Existe-t-il un moyen d'accéder à une instance d'une classe à l'intérieur des fonctions en PHP? Comme ceci:Classe PHP globale dans les fonctions?

include("class.php"); 
$bla=new Classname(); 

function aaa(){ 
    $bla->DoSomething(); //Doesn't work. 
} 

$bla->DoSomething(); //Works. 

Répondre

4

Si j'interprète votre question correctement, alors la bonne façon de le faire est de créer une classe singleton.

class Singleton { 
    private static $instance; 

    private function __construct() {} 
    private function __clone() {} 

    public static function getInstance() { 
     if (!Singleton::$instance instanceof self) { 
      Singleton::$instance = new self(); 
     } 
     return Singleton::$instance; 
    } 

    public function DoSomething() { 
     ... 
    } 
} 

Vous appelez dans votre fonction comme suit:

function xxx() { 
    Singleton::getInstance()->DoSomething(); 
} 
+0

mais s'il veut avoir plus d'une instance de cette classe? un singleton est inutile ici. – GSto

+0

Relisez sa question. Il demande spécifiquement "est-il un moyen d'accéder à une instance d'une classe à l'intérieur des fonctions en php" – wimvds

+1

Et comme je l'ai déjà dit dans la réponse, juste un petit lien que vous devriez suivre et décider pour vous-même si singleton est vraiment le bon chemin: http://code.google.com/p/google-singleton-detector/wiki/WhySingletonsAreControversial – tDo

6

Utilisation global:

function aaa() { 
    global $bla; 
    $bla->DoSomething(); 
} 

Travaux sur toutes les variables, et pas seulement les classes.

+1

C'est la solution la plus directe et au moins faire votre travail de code légèrement couplé jusqu'à ce que le code plus élégant est écrit. – grantwparks

1

Si vous souhaitez imposer l'utilisation d'une seule instance d'une classe dans votre application, vous devez utiliser un singleton et non un global. Vous pourriez faire quelque chose comme ceci:

class Classname { 
    private static $instance; 

    private function __construct() {...} 

    public function doSomething() {...} 

    // The singleton method 
    public static function singleton() { 
     if (!isset(self::$instance)) { 
      self::$instance = new self; 
     } 

     return self::$instance; 
    } 

    private function __clone() { /* do nothing here*/ } 
} 


function aaa() { 
    Classname::getInstance()->doSomething(); 
} 
+0

lien est cassé – NaveenDA

2

Le moyen le plus propre serait de passer l'instance en référence à la classe donnée et ensuite d'y accéder.

Une autre façon serait d'utiliser un modèle singleton, bien que beaucoup prétendent que ce n'est pas vraiment mieux qu'un global.

1

Comme déjà répondu, vous pouvez utiliser un global variable pour stocker l'instance de classe, mais il me semble que vous devriez envisager d'utiliser quelque chose comme le Singleton pattern à la place pour une implémentation plus propre.

Vous pouvez trouver un exemple simple d'une classe singleton here.

Questions connexes