begin process at 2010 03 21 19:36:08
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > [PHP5] FACTORY ET PARAMÈTRES CONSTRUCTEURS

[PHP5] FACTORY ET PARAMÈTRES CONSTRUCTEURS


 Information sur la source

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :php5, poo, reflexion, factory Niveau :Initié Date de création :23/11/2006 Date de mise à jour :24/11/2006 17:17:39 Vu :3 806

Auteur : Naixn

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

 Description

Lorsque l'on utilise une gestion modulaire (par exemple un système de Factory), et que l'on charge dynamiquement les classes, il est plutôt usuel de leur passer en paramètre un tableu de configuration :
return new $className($config);
Seulement, il arrive peut-être des fois où l'on veut intégrer une classe déjà existante que, elle, prends quelques paramètres. Il n'est certes pas difficile du tout de réécrire le  bout de code faisant en sorte que le tout soit géré dans un array, mais je pense qu'il est globalement mieux d'avoir une liste de paramètres. D'autant plus que celà oblige à passer le nombre exact de paramètres, sinon PHP renvoie une erreur. Avec un array, il faut nous même gêrer ça... Et comme les informaticiens programment plus pour en faire le moins possible après, je pense que ce code a sa place ici :)
Pour ceux qui ne connaissent pas, voici deux liens :
http://en.wikipedia.org/wiki/Reflection_%28compu ter_science%29 (ou http://fr.wikipedia.org/wiki/R%C3%A9flexion_%28inf ormatique%29 , mais moins complet ... )
http://php.net/reflection

Pour faire simple, la réflection, c'est la capacité d'un programme à analyser son état, où à se modifier lui-même.
Il est par exemple possible, en javascript, de modifier le comportemt d'une fonction :
http://en.wikipedia.org/wiki/Self-modifying_code #Example_JavaScript_self-modifying_code

Bref, il n'est pas question ici de modifier le comportement d'une fonction ( il existe d'ailleurs runkit pour ça pour le moment [Même si ça ne vaut pas la réflexion] : http://php.net/runkit ), mais tout simplement de faire appel à une fonction de l'API de réflexion pour instancier notre classe.

Voir le code ci-dessous.

Source

  • <?php
  • class MySQL
  • {
  • function __construct($sBdd, $sUser, $sPass)
  • {
  • echo '<strong>Paramètres :</strong> ' . $sBdd . '/' . $sUser . '/' . $sPass . '<br />';
  • }
  • }
  • class Postgresql
  • {
  • function __construct($sConnextionString)
  • {
  • echo '<strong>Paramètres :</strong> ' . $sConnextionString . '<br />';
  • }
  • }
  • class Factory
  • {
  • private static $_aInstances = array();
  • public static function createInstance($sClassName, $mArgs)
  • {
  • if (!isset(self::$_aInstances[$sClassName]))
  • {
  • if (class_exists($sClassName))
  • {
  • $oClass = new ReflectionClass($sClassName);
  • if (is_array($mArgs))
  • {
  • self::$_aInstances[$sClassName] = $oClass->newInstanceArgs($mArgs);
  • }
  • else if ($mArgs)
  • {
  • self::$_aInstances[$sClassName] = $oClass->newInstance($mArgs);
  • }
  • else
  • {
  • self::$_aInstances[$sClassName] = $oClass->newInstance();
  • }
  • }
  • else
  • {
  • throw new Exception('La classe ' . $sClassName . ' n\'existe pas !');
  • }
  • }
  • return self::$_aInstances[$sClassName];
  • }
  • }
  • try
  • {
  • $oMySQL = Factory::createInstance('MySQL', array('bdd.exemple.com', 'MyUser', 'MyPass'));
  • echo '<strong>$oMySQL</strong> est une instance de la classe : ' . get_class($oMySQL) . '<br />';
  • $oPgsql = Factory::createInstance('Postgresql', 'host=bdd.exemple.com dbname=test user=MyUser password=MyPass');
  • echo '<strong>$oPgsql</strong> est une instance de la classe : ' . get_class($oPgsql) . '<br />';
  • }
  • catch (Exception $e)
  • {
  • echo $e->getMessage();
  • }
  • ?>
<?php

class MySQL
{
	function __construct($sBdd, $sUser, $sPass)
	{
		echo '<strong>Paramètres :</strong> ' . $sBdd . '/' . $sUser . '/' . $sPass . '<br />';
	}
}

class Postgresql
{
    function __construct($sConnextionString)
    {
        echo '<strong>Paramètres :</strong> ' . $sConnextionString . '<br />';
    }
}

class Factory
{
	private static $_aInstances = array();

	public static function createInstance($sClassName, $mArgs)
	{
		if (!isset(self::$_aInstances[$sClassName]))
		{
			if (class_exists($sClassName))
			{
				$oClass = new ReflectionClass($sClassName);
				if (is_array($mArgs))
				{
					self::$_aInstances[$sClassName] = $oClass->newInstanceArgs($mArgs);
				}
				else if ($mArgs)
				{
					self::$_aInstances[$sClassName] = $oClass->newInstance($mArgs);
				}
				else
				{
					self::$_aInstances[$sClassName] = $oClass->newInstance();
				}
			}
			else
			{
				throw new Exception('La classe ' . $sClassName . ' n\'existe pas !');
			}
		}
		return self::$_aInstances[$sClassName];
	}
}

try
{
	$oMySQL = Factory::createInstance('MySQL', array('bdd.exemple.com', 'MyUser', 'MyPass'));
	echo '<strong>$oMySQL</strong> est une instance de la classe : ' . get_class($oMySQL) . '<br />';
	$oPgsql = Factory::createInstance('Postgresql', 'host=bdd.exemple.com dbname=test user=MyUser password=MyPass');
	echo '<strong>$oPgsql</strong> est une instance de la classe : ' . get_class($oPgsql) . '<br />';
}
catch (Exception $e)
{
	echo $e->getMessage();
}

?>

 Conclusion

Bon j'aurais aussi pu remplacer :
///
if (is_array($mArgs))
{
  self::$_aInstances[$sClassName] = $oClass->newInstanceArgs($mArgs);
}
else
{
  self::$_aInstances[$sClassName] = $oClass->newInstance($mArgs);
}
\\\

Par

///
$new Function = (is_array($mArgs) ? 'newInstanceArgs' : 'newInstance');
self::$_aInstances[$sClassName] = $oClass->$newFunction($mArgs);
\\\

Ah, et le code du Factory a été très largement inspiré par cette source, merci à l'auteur :
http://www.phpcs.com/codes/PHP5-COUCHE-ABSTRACTI ON-SGBD_35488.aspx

Have fun :)
Mais j'ai préféré garder le code lisible pour que tout le monde puisse comprendre :)


 Historique

23 novembre 2006 22:19:16 :
Rajouté un petit remerciement :)
24 novembre 2006 08:17:59 :
Modifié un bout de la description
24 novembre 2006 10:22:49 :
Ajout d'un lancement d'exception si la classe à instancier n'existe pas.
24 novembre 2006 10:24:29 :
...
24 novembre 2006 17:17:39 :
Oublié le cas où le constructeur ne recevrait aucun paramètres (ou s'il n'y a pas de constructeur)

 Sources du même auteur

Source avec Zip Source avec une capture GALERIE SIMPLE MAIS EFFICACE
MY_MKDIR

 Sources de la même categorie

Source avec Zip CLASSE TABLE HTML DYNAMIQUE par LDDL
Source avec Zip GÉNÉRATEUR DE COUCHE DAO POUR SITE WEB À PARTIR D'UNE BASE D... par alexfool
Source avec Zip [PHP5.2] CLASSE PDO par hornetbzz
Source avec Zip POO - LOGGING PACKAGE par Waredan
POO - OBJECT CLASS par Waredan

 Sources en rapport avec celle ci

Source avec Zip [PHP5.2] CLASSE PDO par hornetbzz
Source avec Zip POO - FACTORY CLASS par Waredan
CLASS RECHERCHE PHP5 POO par mtrix000
CLASS AUTHENTIFICATION PHP5 POO par mtrix000
CLASS PAGINATION PHP5 POO par mtrix000

Commentaires et avis

Commentaire de malalam le 24/11/2006 09:21:58 administrateur CS

Hello,

c'est pas mal du tout. Utiliser l'API de réflexion pour une méthode d'usinage est une très bonne idée.
Manque juste une petite gestion d'erreur si on demande une classe n'existant pas (une Exception), et un try catch sur tes instanciations, ensuite (en dehors de la classe je veux dire).

J'avais utilisé cet API en profondeur pour ma classe de documentation de classes et de fonctions, mais je n'y avais jamais pensé poru de l'usinage.

Commentaire de Naixn le 24/11/2006 10:26:31

Merci ! Et merci du rappel aussi...
Dans ma classe de test, j'avais bel et bien mis la gestion d'erreur, mais lorsque j'ai mis en forme pour poster ici, ça a disparu... Et j'ai pas pensé à vérifier. Fatigue quand tu nous tiens. :)

En tout cas, j'espère que cette API évoluera encore :p

Commentaire de kankrelune le 24/11/2006 15:56:23

Ouep c'est ttrès utile comme principe... j'utilise quelque chose de similaire en php4... à la différence près que...

1 $arg est facultatif... si vide la class est instanciée sans arguments

2 le fichier de la class est inclu par la fonction si la class n'est pas déclarée (et que le fichier est trouvé biensur)... .. .

Au final c'est une sorte d'__autoload() à la sauce php4... .. .

^_^
@ tchaOo°

Commentaire de Naixn le 24/11/2006 17:18:58

La pratique, c'est toujours utile. Je viens donc de mettre en pratique ce code, et je viens de me rendre compte que j'avais oublié le cas où il n'y aurais pas de constructeur dans la classe ( où si le constructeur ne prends pas de paramètres )

Commentaire de Teclis01 le 07/12/2008 15:26:23

Avec un peu de retard ...
Je crois que y'a une coquille ligne 34 !
Si je veux instancer un Boolean je dois passer un param disons ... false pour créer un bool qui vaut false.
A vu de nez euh
l.23 public static function createInstance($sClassName, $mArgs=null)
l.34 elseif(!is_null($mArgs)){

J'me trompe ?

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

differnec entre php 4 et php5 [ par hardelgylls ] Bonjourpetite question :j'ai passer un oral et l'examinateur m'a demandé quel était la différence entre php4 et php5. et la gros blanc, est ce que qqu Doc PHP5 sniff sniff [ par slhuilli ] Bonjour, Bonsoir,Je suis a la recherche d'un PDF qui recenserait les mots-clefs + explications (bref un bouquin complet) sur PHP 5 qui parait-il est Class POO retourné le nom de l'objet [ par MeTh ] Bonjour,Comment retourné le nom de l'objet déclaré?exemple :$monobjet = new GridR();comment recuperé $monobjet dans ma class?Merci Pb passage PHP4 -> PHP5 [ par Galmiza ] Salut,J'ai acheté un bouquin pour débuter le PHP.J'ai suivi a la lettre les instructions du livre:-installer EasyPHP 1.7-installer PHP 5.0..-lancer Ea Cohabitation PHP4 PHP5 sur même serveur ! [ par Zacland ] Ce n'est pas une question, mais je me doute que certaines personnes veulent essayer de faire cohabiter 2 versions de PHP sur un même serveur Apache... Un caractére se trouve t'il dans ma chaîne... [ par juki_webmaster ] Bonsoir,Je travaille depuis 14h cette apres-midi sur une fonction alternative d'une fonction connu et disponible uniquement sur php5, je fait cette fo PHP5 en PHP3 [ par el shaddai ] J'ai développé une partie de site en PHP5. MAlheureusement , chargé chez FREE, ils n'utilisent que PHP3. Y a t-il une manip simple pour qur du PHP5 pa PHP5 et MySQL 4.1.7 [ par TMT ] J'ai installé PHP5 et MySQL sur mon Windows XP avec IIS. J'ai bien activé le module php_mysql dans le fichier php.ini Là mon problème est qu-à chaque php4 vers php5 [ par aurelielaugraud ] Bonjour, Je suis passée de php4 à php5 pour utiliser la librairie graphique GD. Seulement, un programme que j'avais précédemment faire refuse de fonct Modification d'un script pour conformité avec php4 et/ou php5 [ par christobal ] Bonjour, depuis plusieurs ann&#233;es j'utilise le m&#234;me script pour mes sites.Maitenant avec les derrnieres version de PHP4 et PHP5 ce script ne


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
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,671 sec (4)

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