begin process at 2012 05 27 17:58:43
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > PHP5 - INSTANCIATION UNIQUE DE CLASSE VIA MULTITON

PHP5 - INSTANCIATION UNIQUE DE CLASSE VIA MULTITON


 Information sur la source

Note :
9,6 / 10 - par 5 personnes
9,60 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :poo, multiton, singleton, php5, instance Niveau :Initié Date de création :07/03/2006 Date de mise à jour :07/03/2006 13:17:16 Vu :6 792

Auteur : FhX

Ecrire un message privé
Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note

 Description

Wowowow, avec un titre aussi compliqué je me demande comment vous avez fait pour venir jusqu'ici :)

Bon petite explication. J'ai developpé une petite classe grâce aux conseils avisés de la doc de php.net qui va me permettre d'instancier une seule fois la classe que je souhaite utiliser, et surtout que je puisse rendre mon objet global à tout mon projet.

J'utilise la méthode du Multiton (soit un Singleton mais version multiple) mais dans une classe à part. Voici donc ce que ca donne "codifiant parlant" :

Source

  • <?php
  • class ModInterface {
  • public static $_instance = array();
  • public static function GetInstance($name, $args = array()) {
  • if ( !isset(self::$_instance[$name]) ) {
  • if ( class_exists($name) ) {
  • // Création des arguments pour le constructeur de classe
  • $arglist = array();
  • for ($i = 0, $n = count($args); $i < $n; $i++) {
  • $arglist[] = '$args['.$i.']';
  • }
  • $arglist = implode(',', $arglist);
  • // Création d'une fonction temporaire pour l'instanciation de la classe
  • $new_class = create_function('$name, $args', 'return new $name('.$arglist.');');
  • define(strtoupper($name), NULL);
  • self::$_instance[$name] = $new_class($name, $args);
  • }
  • }
  • return self::$_instance[$name];
  • }
  • }
  • // Voici donc la classe en elle-même. Maintenant, voyons comment je peux utiliser pour... par exemple... instancier ma base de donnée mysql.
  • // Ma base de donnée s'utilise avec une classe qui porte comme nom mysql. Exemple :
  • $mysql = ModInterface::GetInstance('mysql');
  • // Hop, je peux utiliser $mysql comme un objet qui va me servir pour ma base de donnée.
  • //$mysql->query();
  • //$mysql->fetch_row(); etc...
  • //On peut également utiliser $mysql dans une classe sans le faire passer en argument via le constructeur ! Exemple :
  • class x {
  • public function __construct() {
  • $mysql = ModInterface::GetInstance('mysql');
  • }
  • }
  • // Non seulement je n'instancie mon objet qu'une seule fois, mais en plus je peux l'utiliser partout ! Gain d'exécution notable !!
  • // Je peux également faire passer des arguments à mon objet. Imaginons ceci :
  • class y {
  • public function __construct($arg1, $arg2) { // }
  • }
  • Voici comment je peux instancier cet objet :
  • $y = ModInterface::GetInstance('y', array($arg1, $arg2));
  • //$y est un objet !
  • ?>
<?php
class ModInterface {

 public static $_instance = array();
 
 public static function GetInstance($name, $args = array()) {
 
  if ( !isset(self::$_instance[$name]) ) {
        if ( class_exists($name) ) {
		    
			// Création des arguments pour le constructeur de classe
		     $arglist = array();
			  for ($i = 0, $n = count($args); $i < $n; $i++) {
			      $arglist[] = '$args['.$i.']';
			  }
			 $arglist = implode(',', $arglist);
			 
			// Création d'une fonction temporaire pour l'instanciation de la classe
			$new_class = create_function('$name, $args', 'return new $name('.$arglist.');');
			define(strtoupper($name), NULL);
			self::$_instance[$name] = $new_class($name, $args);
		}
  }
  
  return self::$_instance[$name];

 }

}

// Voici donc la classe en elle-même. Maintenant, voyons comment je peux utiliser pour... par exemple... instancier ma base de donnée mysql.
// Ma base de donnée s'utilise avec une classe qui porte comme nom mysql. Exemple :

$mysql = ModInterface::GetInstance('mysql');
// Hop, je peux utiliser $mysql comme un objet qui va me servir pour ma base de donnée.
//$mysql->query();
//$mysql->fetch_row(); etc...

//On peut également utiliser $mysql dans une classe sans le faire passer en argument via le constructeur ! Exemple :
class x {
 public function __construct() {
  $mysql = ModInterface::GetInstance('mysql');
 }
}
// Non seulement je n'instancie mon objet qu'une seule fois, mais en plus je peux l'utiliser partout ! Gain d'exécution notable !!


// Je peux également faire passer des arguments à mon objet. Imaginons ceci :
class y {
 public function __construct($arg1, $arg2) { // }
}

Voici comment je peux instancier cet objet :
$y = ModInterface::GetInstance('y', array($arg1, $arg2));
//$y est un objet !

?>

 Conclusion

Voici donc comment instancier une seule fois son objet et l'utiliser partout dans son projet !

On peut même faire d'autres méthodes à ma classe d'interface aux cas d'une instanciation un peu différente (par exemple, en fonction du 'level' d'un membre pour appeler la bonne classe etc...)

Bref, plein de choses interessantes et qui reste sous controle !

Voila voila :)


J'ai oublié ceci :
N'oubliez pas dans vos classes de rajouter ceci dans votre constructeur :
if ( !defined(strtoupper(__CLASS__)) ) throw new Exception('Classe non appelé correctement');

Ca vous prémunira d'une instanciation douteuse :p


 Historique

07 mars 2006 13:17:16 :
Rajout d'un problème d'instanciation

 Sources du même auteur

PHP5 - UTILISATION DES ITÉRATEURS ET DE LA RÉFLECTION.
PHP 5 - CLASSE MYSQL (STYLE MYSQLI)
[PHP5] CLASSE DATE/HEURE
PHP5 - GESTION DE MODULES EN OBJET
PHP5 - CLASSE DE NEWS ET DE COMMENTAIRES

 Sources de la même categorie

Source avec Zip GÉNÉRATION AUTOMATIQUE DE FICHIER .CLASS.PHP EN FONCTION D'U... par ig3
CLASSE D'OBJET DE CRYPTAGE ET DÉCRYPTAGE DE CHAINES DE CARAC... par 8Tnerolf8
Source avec Zip MY.DEVIANTART API par inwebo
CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture TODO LIST (AJAX/PHP5) par VinceMonkeyz
Source avec Zip [PHP5.2] CLASSE PDO par hornetbzz
POO - SINGLETON CLASS par Waredan
CLASS RECHERCHE PHP5 POO par mtrix000
CLASS AUTHENTIFICATION PHP5 POO par mtrix000

Commentaires et avis

Commentaire de malalam le 07/03/2006 13:59:48 administrateur CS

C'est un très joli code :-)
Je testerai dès que possible dans un gros projet pour voir le gain.

Commentaire de Kirua le 08/03/2006 08:49:28

J'aime bcp le concept :) Et puis ça change ^^.

Tu dis:

if ( !defined(strtoupper(__CLASS__)) ) throw new Exception('Classe non appelé correctement');

mais comment pourrait-on appeler le constructeur d'une classe sans qu'elle soit définie? j'ai du mal ^^. mci!

Commentaire de FhX le 08/03/2006 11:44:47

Dans ma méthode statique, y'a ca :
define(strtoupper($name), NULL);

Ce qui fait que je défini une constante à ce moment la. Le nom de la constante étant le nom de la classe.
Donc à l'appel de mon constructeur, je regarde si la constante est initialisée !

Par contre, j'ai oublié quelque chose... c'est à dire le fait d'avoir instancier une classe via ModInterface::GetInstance() puis ensuite pouvoir faire : $x = new class;

Jvais corriger ca :)

Commentaire de kankrelune le 08/03/2006 14:23:00

Sympa ce code... .. . ;o)

J'utilise le même concept hormis qu'il sagit d'une fonction et non d'une class et que les objets sont stockés dans une variable statique... ce qui au final revient un peut au même... juste que je vois pas l'interet de faire une class pour une seul méthode (mais c'est un avis perso)... .. .

9/10... .. . ;o)

@ tchaOo°

Commentaire de FhX le 08/03/2006 15:56:51

Bah en faite, cette méthode peut être appliquée pour chaque classe individuellement ! Hors la, je regroupe tous les Singletons de chaque classe.

Maintenant pourquoi une classe ? Parce que ma préférence va pour l'objet, voila tout :)
Maintenant, dans ma classe à moi, je n'ai pas que cette méthode car j'ai des classes qui s'instancient un peu différement :)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

PDO + singleton [ par eltyty ] Bonjour, J'ai réalisé un code pour réaliser une connexion "singleton" avec PDO or j'ai une erreur. Voilà le code du singleton : [code=php] class C Singleton encore [ par eltyty ] Bonjour, je ne comprends pas pourquoi j'ai une erreur. J'essaie d'utiliser le singleton mais je n'arrive pas à appeler une fonction à l'intérieur. Vo PHP5 curl [ par imen2008 ] bjr, j'ai cherche un script php qui permet d'utiliser un moteur de recherche( google par exemple) pour avoir la liste de lien correspondant à ma reche php5 insert into [ par manu7930 ] bonjour, j'ai une fonction insert into qui me semble correcte mais elle n'insert rien dans ma base: mysql_select_db("149224", $mysql_link); $sql= Script qui fonctionne en PHP5, pas en PHP4... [ par seb841 ] Bonjour, J'ai un petit soucis, j'ai une date recuperée au format AAAA-MM-JJ. J'ai ensuite ce petit script qui me permet de récuperer le nom du jou php5 [ par luffy2009 ] j'ai entrain de devloppe une application avec php5 et dans cette application j'ai besoin de faire un moteur de recherche jai besoin de votre aide pou Exemple des projets ou des minis projets en php/POO [ par abdeslam2009 ] Bonjours Je suis en train de développer un projet en php/POO je voudrais quelques exemples sur les projets les minis projets en POO,j'ai suivi les inf migration php4 a php5 [ par lylya ] Bonjour. je doit faire la migration de php4 à php5 le code que j'ai ne contient pas d'objet donc normalement si j'ai bien compris ce n'est pas si comp migration php4 à php5 [ par lylya ] Bonjour. je doit faire la migration de php4 à php5 le code que j'ai ne contient pas d'objet donc normalement si j'ai bien compris ce n'est pas si com


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,749 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales