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

Code

 > 

Class et Objet ( POO )

 > PHP5 - GESTION DE MODULES EN OBJET

PHP5 - GESTION DE MODULES EN OBJET


 Information sur la source

Note :
10 / 10 - par 5 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :php5, poo, core, module, héritage Niveau :Initié Date de création :14/11/2006 Vu :10 700

Auteur : FhX

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

 Description

Kikoo :)

Bon, ca faisait bien longtemps que j'avais pas posté, et pour cause... les études ayant repris (pour ma part :p), j'ai un peu tous les langages qui viennent se méler un peu n'importe comment donc PHP passe un peu par la trappe ces temps ci.
Qu'à cela ne tienne, me voila de retour (ca me manquait un peu je dois dire) !

Alors, j'ai déja fais une classe à peu près à l'identique, sauf que cette fois ci... elle est fonctionnelle !

Le code se découpe en 2 (nan en 3 en faites) :
-> fichier XML en tant que fichier de configuration (jvois déja Malalam qui sourit ^^)
-> Classes PHP.

Pour mes classes PHP, y'a en tout 2 classes :
  -> Une classe abstraite Core que toutes mes classes de mon projet vont hériter. Cette classe contient tout le nécessaire pour la gestion des modules.
  -> Une classe concrète SystemCore qui lui seul peut gérer les modules et autres évenements survenu dans le Core.

Je peux ajouter une 3ème classe Mysql pour vous faire voir que c'est totalement transparent :)

Ce que ce script fait :
-> Gestion des classes en tant que modules. Permet d'activer ou non un module, de pouvoir logguer ces actions...

Voyons le code en détail.

Source

  • <?php
  • // En premier lieu, le fichier .xml
  • ?>
  • <?xml version='1.0'?>
  • <modules status="1">
  • <module name="systemcore" status="2" src="./class/SystemCore.php" />
  • <module name="log" status="1" src="./class/log.php" />
  • <module name="mysql" status="1" src="./class/mysql.php" />
  • <module name="msn" status="1" src="./class/msn.php" />
  • </modules>
  • <?php
  • // Jusque la, pas de suprise. Je dispose de plusieurs modules (pour l'exemple) : systemcore (obligatoire), log (pour avoir un système de logging), mysql (pour ma gestion de base de donnée) et msn (pour avoir mon status d'afficher sur mon site).
  • // Le status se découpe comme ceci : 0 - Inactif ; 1 - Actif ; 2 - Actif avec débug.
  • // Le src indique le chemin de la classe. Pas obligatoire, ca sert à rien sinon à faire joli pour le moment ^^
  • // Visons la classe abstraite maintenant :
  • abstract class Core {
  • private static $_module = array();
  • private static $_xml;
  • private $FileConf = './xml/conf.xml';
  • protected $debug = FALSE;
  • // Initalisation de chaque module
  • protected function __construct() {
  • $classname = strtolower(get_class($this));
  • // Si la classe a déja été instancié, pas la peine de refaire une recherche.
  • if ( !isset(self::$_module[$classname]) ) {
  • // On charge le fichier de conf.
  • self::$_xml = simplexml_load_file($this->FileConf);
  • //On regarde si le module existe dans le fichier de conf.
  • $var = self::$_xml->xpath('//module[@name="'.$classname.'"]');
  • // Si c'est pas le cas ==> erreur
  • if ( $var === FALSE )
  • throw new Exception('Module '.$classname.' introuvable dans le fichier de configuration');
  • // On recherche la chaine XML du module.
  • $mod = simplexml_load_string($var[0]->asXml());
  • // On vérifie son status.
  • if ( (int) $mod['status'] === 0 ) {
  • throw new Exception('Module '.$classname.' ne peut être chargé : Status = 0');
  • } elseif ( (int) $mod['status'] === 2 ) {
  • $this->debug = TRUE;
  • }
  • }
  • // On oublie pas de mettre le module comme actif :)
  • self::$_module[$classname]['actif'] = TRUE;
  • }
  • // Destruction de chaque module.
  • public function __destruct() {
  • $classname = strtolower(get_class($this));
  • self::$_module[$classname]['actif'] = FALSE;
  • }
  • // Récupère les infos du Core SEULEMENT par la classe Système.
  • protected function GetCoreInfos($property) {
  • if ( $this->isSystemCore() ) {
  • switch ( $property ) {
  • case 'fileconf':
  • return $this->_xml;
  • break;
  • case 'module':
  • $modulename = func_get_arg(1);
  • return ( isset(self::$_module[$modulename] ) ) ? self::$_module[$modulename] : FALSE;
  • break;
  • default:
  • throw new Exception ($property.' n\'existe pas !');
  • }
  • } else {
  • throw new Exception('Impossible d\'accéder aux ressources... Accès impossible ! (GetCoreInfos '.$property.' )');
  • }
  • }
  • // Ecrit des infos dans le Core SEULEMENT par la classe Système.
  • protected function SetCoreInfos($property) {
  • if ( $this->isSystemCore() ) {
  • switch ( $property ) {
  • case 'module':
  • $modulename = func_get_arg(1);
  • $key = func_get_arg(2);
  • $val = func_get_arg(3);
  • self::$_module[$modulename][$key] = $val;
  • break;
  • }
  • } else {
  • throw new Exception('Impossible d\'accéder aux ressources... Accès impossible ! (SetCoreInfos '.$property.' )');
  • }
  • }
  • // Vérification si présence de la classe Système pour accéder au ressources du Core.
  • private function isSystemCore() {
  • if ( get_class($this) === 'SystemCore' && is_subclass_of('SystemCore', 'Core') ) {
  • return TRUE;
  • } else {
  • return FALSE;
  • }
  • }
  • }
  • // Toute classe abstraite ou concrète DOIT ( c'est une OBLIGATION !!! ) étendre cette classe !
  • // Cette classe abstraite "core" est le coeur de la gestion des classes.
  • // Maintenant, voici le code de ma classe abstraite pour gérer le Core :
  • // Classe Système. Peut intéragir avec le Core.
  • class SystemCore extends Core {
  • // Instance unique du Système.
  • private static $_SystemInstance;
  • // Identifie le système dans le Core.
  • protected function __construct() {
  • parent::__construct();
  • }
  • // Instance unique.
  • public static function GetInstance() {
  • if ( !isset(self::$_SystemInstance) ) self::$_SystemInstance = new self;
  • return self::$_SystemInstance;
  • }
  • // Recherche de l'activation ou non d'un module dans le Core.
  • public function isActive($modulename) {
  • $mod = $this->GetCoreInfos('module',$modulename);
  • return $mod['actif'];
  • }
  • // Pré-initialise un module dans le corps. (Evite le parsing du fichier xml)
  • public function PreInit($modulename) {
  • $this->SetCoreInfos('module', $modulename, 'actif', TRUE);
  • /* if ( $this->debug ) {
  • $this->newEntry('Pré-initialisation du module '.$modulename.' accomplie.');
  • }*/
  • }
  • }
  • // Voila, on voit bien que le Système peut faire ce qu'il veut avec les modules, choses que peut ne pas faire les autres classes qui héritent.
  • // Une autre classe concrète, celui d'une base de donnée (raccourcie au max !!) :
  • class mysql extends Core {
  • public function __construct($host, $user, $passwd, $basename) {
  • parent::__construct(); // Obligatoire !
  • mysql_connect(...);
  • }
  • }
  • // Bref, c'est une classe banale quoi.
  • // Maitenant, voyons voir comment ca fonctionne dans une page web.
  • // On inclus les fichiers :
  • include ('core.php');
  • include ('mysql.php');
  • include ('systemcore.php');
  • // Jusque la tout va bien. Je vais donc initialiser ma classe de BDD :
  • try {
  • $db = new mysql;
  • } catch ( Exception $e ) {
  • die ($e->getmessage());
  • }
  • // Et oui ! C'est tout simple ! C'est exactement comme si on instanciait une classe "normale" !
  • // Où est l'intéret de mon "Core" la dedand ?
  • // Simple, il ne faut pas oublier que tout tourne autour de mon fichier XML. Pour rappel, j'ai mis mysql en tant que "Status = 1", donc j'ai activé le droit d'utiliser mysql sur mes pages. Si j'avais mis "Status = 0" j'aurais eu une exception !
  • // Cette méthode sera pareil pour les autres classes.
  • // Regardons maintenant si ma classe est bien initialisée par le Core :
  • $Sys = SystemCore::GetInstance(); // On récupère l'instance unique du Systeme.
  • if ( $Sys->isActive('mysql') ) {
  • echo 'Module mysql activé';
  • }
  • // On voit bien que le texte "Module mysql activé" est affiché à l'écran. Donc c'est que tout va bien.
  • // Si un jour, pour une raison où pour une autre, vous souhaitez couper un module (un bug dessus par exemple), il suffit de modifier le fichier XML et mettre "Status = 0" sur le module que vous voulez couper.
  • // Tout ca doit être géré dans le SystemeCore... chose que je n'ai pas encore implanté pour le moment. Ca va venir :)
  • // Tout est centralisé avec ce système... il n'y a plus de modules de classes qui se baladent dans le vide.
  • // Ca nécessite de passer votre projet au "prèsque tout-objet"... mais ca reste une facon de coder assez sympatoche :)
<?php
 // En premier lieu, le fichier .xml
?>
<?xml version='1.0'?>
<modules status="1">
 <module name="systemcore" status="2" src="./class/SystemCore.php" />
 <module name="log" status="1" src="./class/log.php" />
 <module name="mysql" status="1" src="./class/mysql.php" />
 <module name="msn" status="1" src="./class/msn.php" />
</modules>
<?php
 // Jusque la, pas de suprise. Je dispose de plusieurs modules (pour l'exemple) : systemcore (obligatoire), log (pour avoir un système de logging), mysql (pour ma gestion de base de donnée) et msn (pour avoir mon status d'afficher sur mon site).
 // Le status se découpe comme ceci : 0 - Inactif ; 1 - Actif ; 2 - Actif avec débug.
 // Le src indique le chemin de la classe. Pas obligatoire, ca sert à rien sinon à faire joli pour le moment ^^

 // Visons la classe abstraite maintenant :

abstract class Core {

 private static $_module = array();
 private static $_xml;
 private $FileConf = './xml/conf.xml';

 protected $debug = FALSE;
 
// Initalisation de chaque module
 protected function __construct() {

  $classname = strtolower(get_class($this));  
   
  // Si la classe a déja été instancié, pas la peine de refaire une recherche.
   if ( !isset(self::$_module[$classname]) ) {
   	    // On charge le fichier de conf.
         self::$_xml = simplexml_load_file($this->FileConf);
         
        //On regarde si le module existe dans le fichier de conf.
         $var = self::$_xml->xpath('//module[@name="'.$classname.'"]');
        // Si c'est pas le cas ==> erreur
          if ( $var === FALSE )
               throw new Exception('Module '.$classname.' introuvable dans le fichier de configuration');
        
        // On recherche la chaine XML du module.
         $mod = simplexml_load_string($var[0]->asXml());
        // On vérifie son status.
          if ( (int) $mod['status'] === 0 ) {
               throw new Exception('Module '.$classname.' ne peut être chargé : Status = 0');
          } elseif ( (int) $mod['status'] === 2 ) {
   	           $this->debug = TRUE;
          }
   }
   
 // On oublie pas de mettre le module comme actif :)
  self::$_module[$classname]['actif'] = TRUE;
    
 }

// Destruction de chaque module.
 public function __destruct() {
  $classname = strtolower(get_class($this));
  self::$_module[$classname]['actif'] = FALSE;
 }
 
// Récupère les infos du Core SEULEMENT par la classe Système.
 protected function GetCoreInfos($property) {
   if ( $this->isSystemCore() ) {
   	     switch ( $property ) {
   	     	case 'fileconf':
   	     		  return $this->_xml;
   	     		  break;
   	     	case 'module':
   	     		  $modulename = func_get_arg(1);
                  return ( isset(self::$_module[$modulename] ) ) ? self::$_module[$modulename] : FALSE;
                  break;
   	     	default:
   	     		  throw new Exception ($property.' n\'existe pas !');
   	     }
   } else {
   	    throw new Exception('Impossible d\'accéder aux ressources... Accès impossible ! (GetCoreInfos '.$property.' )');
   }
 }
 
// Ecrit des infos dans le Core SEULEMENT par la classe Système.
 protected function SetCoreInfos($property) {
  if ( $this->isSystemCore() ) {
  	    switch ( $property ) {
  	    	case 'module':
  	    		  $modulename = func_get_arg(1);
  	    		  $key = func_get_arg(2);
  	    		  $val = func_get_arg(3);
	  	   	      self::$_module[$modulename][$key] = $val;
  	    		  break;
  	    }
   } else {
   	    throw new Exception('Impossible d\'accéder aux ressources... Accès impossible ! (SetCoreInfos '.$property.' )');
   }  
 }
 
// Vérification si présence de la classe Système pour accéder au ressources du Core.
 private function isSystemCore() {
  if ( get_class($this) === 'SystemCore' && is_subclass_of('SystemCore', 'Core') ) {
  	   return TRUE;
  } else {
       return FALSE;
  }	
 }
 
}

// Toute classe abstraite ou concrète DOIT ( c'est une OBLIGATION !!! ) étendre cette classe !
// Cette classe abstraite "core" est le coeur de la gestion des classes.

// Maintenant, voici le code de ma classe abstraite pour gérer le Core :


// Classe Système. Peut intéragir avec le Core.
class SystemCore extends Core {

 // Instance unique du Système.
 private static $_SystemInstance;

 // Identifie le système dans le Core.
 protected function __construct() {
  parent::__construct();
 }
 
// Instance unique.
 public static function GetInstance() {
   if ( !isset(self::$_SystemInstance) ) self::$_SystemInstance = new self;
  return self::$_SystemInstance;
 }

// Recherche de l'activation ou non d'un module dans le Core.
 public function isActive($modulename) {
  $mod = $this->GetCoreInfos('module',$modulename);
  return $mod['actif'];
 }

// Pré-initialise un module dans le corps. (Evite le parsing du fichier xml)
 public function PreInit($modulename) {
  $this->SetCoreInfos('module', $modulename, 'actif', TRUE);
 /*  if ( $this->debug ) {
   	    $this->newEntry('Pré-initialisation du module '.$modulename.' accomplie.');
   }*/
 }
 
}

// Voila, on voit bien que le Système peut faire ce qu'il veut avec les modules, choses que peut ne pas faire les autres classes qui héritent.

// Une autre classe concrète, celui d'une base de donnée (raccourcie au max !!) :

class mysql extends Core {

 public function __construct($host, $user, $passwd, $basename) {
   parent::__construct(); // Obligatoire !
   mysql_connect(...);
 }

}

// Bref, c'est une classe banale quoi.
// Maitenant, voyons voir comment ca fonctionne dans une page web.

// On inclus les fichiers :
include ('core.php');
include ('mysql.php');
include ('systemcore.php');
// Jusque la tout va bien. Je vais donc initialiser ma classe de BDD :
try {
 $db = new mysql;
} catch ( Exception $e ) {
  die ($e->getmessage());
}
// Et oui ! C'est tout simple ! C'est exactement comme si on instanciait une classe "normale" !
// Où est l'intéret de mon "Core" la dedand ?
// Simple, il ne faut pas oublier que tout tourne autour de mon fichier XML. Pour rappel, j'ai mis mysql en tant que "Status = 1", donc j'ai activé le droit d'utiliser mysql sur mes pages. Si j'avais mis "Status = 0" j'aurais eu une exception !
// Cette méthode sera pareil pour les autres classes.

// Regardons maintenant si ma classe est bien initialisée par le Core :
$Sys = SystemCore::GetInstance(); // On récupère l'instance unique du Systeme.
 if ( $Sys->isActive('mysql') ) {
      echo 'Module mysql activé';
 }

// On voit bien que le texte "Module mysql activé" est affiché à l'écran. Donc c'est que tout va bien.
// Si un jour, pour une raison où pour une autre, vous souhaitez couper un module (un bug dessus par exemple), il suffit de modifier le fichier XML et mettre "Status = 0" sur le module que vous voulez couper.
// Tout ca doit être géré dans le SystemeCore... chose que je n'ai pas encore implanté pour le moment. Ca va venir :)

// Tout est centralisé avec ce système... il n'y a plus de modules de classes qui se baladent dans le vide.
// Ca nécessite de passer votre projet au "prèsque tout-objet"... mais ca reste une facon de coder assez sympatoche :)

 Conclusion

Bon bah voila à peu près vite fait ce que ca peut donner.

Si y'a des suggestions (en rajout - modif - suppression de choses), je suis preneur pour agrémenter tout ca.
Vala vala :)


 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 - CLASSE DE NEWS ET DE COMMENTAIRES
PHP5 - CLASSE DE GESTION DE MODULES

 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
CLASS RECHERCHE PHP5 POO par mtrix000
CLASS AUTHENTIFICATION PHP5 POO par mtrix000
PHP5 - CLASSE DE GESTION DE MODULES par FhX

Commentaires et avis

Commentaire de malalam le 14/11/2006 18:50:52 administrateur CS

On en a déjà discuté donc...juste le 10, pas de commentaire (pour le moment).

Commentaire de wizad le 14/11/2006 19:46:14

C'est une nouvelle version de ta précédente source?

Commentaire de malalam le 15/11/2006 08:16:04 administrateur CS

Largement plus poussée; la précédente était plus un tuto expliquant une idée. Là, c'est vraiment la mise en code de cette idée.

Commentaire de wizad le 15/11/2006 11:31:12

sinon la classe est pas mal intérréssante (et je dirais que le choix du xml ou d'une base de données est à chacun en fonction de ses moyens/preférences/...). Maintenant je me suis toujours pune question sur les systèmes modulaire : comment associé ça avec un système de template (comme PHPnuke par exemple).

Voilà. Ce qu'il y a de bien c'est que sur phpcs on va bientôt pouvoir se faire un moteur de site web (acceptant les modules) en php5 avec toutes nos sources. ;)

Commentaire de alpha386 le 15/11/2006 14:17:30

Salut

Pourrais-je l'avoir en zip.

Bye

Commentaire de juki_webmaster le 15/11/2006 14:48:58

// On inclus les fichiers : << Es-tu facher avec __autoload() ?

Commentaire de FhX le 15/11/2006 18:58:00

"C'est une nouvelle version de ta précédente source?" On peut dire ca comme ca oui :)
Encore, comme Mala vient de l'expliquer, ceci est plus du code concret qu'un simple "blabla" que j'avais fait il y a quelques mois :)

"et je dirais que le choix du xml ou d'une base de données est à chacun en fonction de ses moyens/preférences/..." Oui et Non.
Oui parce que je veux bien laisser le choix de la configuration, et Non parce que SQL ne doit pas être utilisé puisqu'il est mis en tant que module. A la limite, je devrais découper mon Core en 2 : Une partie "critique" (genre classe sql et gestion de session) et une autre partie "module" (genre classe users, commentaires, galleries etc...).
Oui je pourrais faire ca en effet :) Jvais m'y attarder tiens.

"Maintenant je me suis toujours pune question sur les systèmes modulaire : comment associé ça avec un système de template (comme PHPnuke par exemple)."Simple, avec du try{}catch{}.
Tu fais ca :
try {
$x = new class();
// Signifie que la classe est instanciable, donc que le module est chargé. On peut continuer et afficher la suite sans problème.
} catch ( Exception $e ) { // Voir à faire une classe d'exception plus poussé aussi.
// Ici, la classe n'est pas instanciable, donc le module est désactivé. On fait tout autre chose.
}

Voila, c'est aussi simple que ca.

"Pourrais-je l'avoir en zip."Oui, quand j'aurais fais des modifs dessus. Un gros travail est en cours, je retravaille le Core au niveau de la gestion des modules (via numéro ID unique plutot que via un nom d'instance).

"Es-tu facher avec __autoload() ?" Pas du tout, mais je voulais pas me faire chier avec une fonction externe à mes classes pour l'exemple du code :)
Rassure toi, __autoload() est bien présent chez moi ^^


Je préviens pour dire que je vais faire une grosse modif du code... Mais que j'attends toujours autant d'idées pour l'améliorer :)

Commentaire de kankrelune le 18/11/2006 15:45:36

"Oui parce que je veux bien laisser le choix de la configuration, et Non parce que SQL ne doit pas être utilisé puisqu'il est mis en tant que module. A la limite, je devrais découper mon Core en 2 : Une partie "critique" (genre classe sql et gestion de session) et une autre partie "module" (genre classe users, commentaires, galleries etc...).
Oui je pourrais faire ca en effet :) Jvais m'y attarder tiens."

Pour moi un module est une partie escamotable du site... un plug-in... pas une partie du core du site... je définnirais donc plutot comme module les sous catéorie d'un site (gallerie photos, espace de téléchargement)... mais c'est une question de sémantique qui n'enleve rien à la qualité de la source... .. .

J'ais une class qui ressemble à la tienne dans le principe... mais pour des modules comme je le définis plus haut... on y retrouve des options tel que...

- isActiv : comme statut pour toi sauf que c'est un booléen la notion de debug étant gérés sur la globalité du site et non par module
- hasAdmin : possede (ou non) une partie administrable à inclure en back office
- hasMain : est directement visionable ou doit etre inclus dans le site

Si ça peut te donner des idées... .. . ;o)

Sinon comme d'hab pas grand chose à redire (muarf même pô drole lOl)... si ce n'est que je ne comprend pas trop l'interet du destructeur de ta classe Core... .. .

Pour la variable $classname pourquoi ne pas la stocker dans un attribut plutot que de faire plusieur fois...

$classname = strtolower(get_class($this));

Mais c'est un détail... .. .

@ tchaOo°

Commentaire de audayls le 20/05/2007 15:40:18

Salut,
Je ne sais pas si tu es en train de refaire une nouvelle version de cette source mais j'ai relevé un peu bug dans cette version.

C'est 3 fois rien et c'est facilement corrigeable : lorsque tu initialises plusieurs fois une classe qui est en status 2 une seule a la variable debug initialisée.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

HELP ME!! instalation du module PHP sur ApacheWin [ par benny54 ] Help me!!!!est ce que quelqu'un pourrait m'aidé pour l'installation du module PHP sur un serveur web Apache Win32?iamtheboss@oreka.com Suggestion Nix! [ par Jackboy ] Salut, maintenant vous allez faire la vérification de nos posts et commantaires. Sans être trop radicale en supprimant un message, rajouter dans ce si 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 executer vb ou delphi [ par fmazoue ] est ce que c possible d'executer sur une page internet des module en vb ou delphi ????parce que en fait je voudrai que l'on puisse coller une image su module d'archivage [ par inssetman ] Bonjour ! :)voilà j'aimerais savoir si vous avez une piste, ou même mieux si qq avait déjà fait qq chose de similaire, sil i pouvait m'envoyer ses sou 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... cherche un module [ par bigc ] ce que je veux Dans module: Membres de la team , clique dessus===&gt;pages avec les noms des membres de la team, clique sur un nom d'un membres ===&gt


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

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