PDA

Voir la version complète : Conception objet en PHP : comment optimiser ?


fornight
08/02/2007, 11h01
Je me mets à l'objet depuis peu de temps en PHP parce qu'on m'avait toujours dit que c'est d'une utilité discutable dans ce langage. Pour l'instant, je pense que je l'exploite très mal vu que je n'ai encore réussi à faire le lien entre la notion d'héritage et l'optimisation probable de mes développements.

Donc je vais essayer de comprendre les choses petit à petit. Pour l'instant les classes ne me servent qu'à classer les fonctions...

Déjà ma première question est de savoir si on peut appeler une classe directement grâce au nom d'une variable comme :

$_GET['sousmenu']::ajouter()

Sur mon serveur ça ne fonctionne pas mais je suis en PHP 4 (oui je sais c'est mal mais j'ai peur de créer des incompatibilité en installant php 5 car c'est un serveur ovh que je configure avec l'utilitaire d'ovh sur webmin...).

Gulix
08/02/2007, 11h08
Je ne connais pas trop l'objet en PHP, mais pour en avoir utilisé, je ne pense pas que cette formulation soit correcte.

$_GET['sousmenu']

Cette commande renvoie le contenu d'une variable, de type chaine normalement (passée en URL). Ce n'est pas un objet déclaré.

Quand tu appelles ta fonction ::ajouter(), tu fais appel à la fonction ajouter d'une classe précise ? Je pense que oui, dans ce cas, tu dois faire quelque chose du genre :


$maVariable = new monObjet();
$maVariable::ajouter();


Si j'ai pu t'aider ...

fornight
08/02/2007, 11h25
Ok, c'est à peu près ce que j'avais compris. Pourtant ça m'étonne qu'il n'y ait pas une méthode "directe" d'appel des classes.

En fait, j'ai une classe "Page" qui fait appel au sous-menu sélectionné selon l'action qui lui est liée :


class Page
{
function afficher()
{
echo '<h1>' . traduire("sousmenu_".$_GET['sousmenu']) . '</h1>' . "\n";

// Si une note doit etre affichee pour la page en cours
if (traduire("note_".$_GET['sousmenu']."_".$_GET['action']) != NULL) {
echo '<div id="note">' . traduire("note_".$_GET['sousmenu']."_".$_GET['action']) . '</div>' . "\n";
} elseif (traduire("note_".$_GET['sousmenu']."_".$_POST['action']) != NULL) {
echo '<div id="note">' . traduire("note_".$_GET['sousmenu']."_".$_POST['action']) . '</div>' . "\n";
}

//===================================================================
// ADMINISTRATION
//===================================================================

// Gestion des modules
if ($_GET['sousmenu'] == "modules") {
if ($_POST['action'] == "ajouter") Modules::ajouter();
elseif ($_POST['action'] == "modifier") Modules::modifier();
elseif ($_GET['action'] == "ajout") Modules::ajout();
elseif ($_GET['action'] == "modification") Modules::modification();
elseif ($_GET['action'] == "suppression") Modules::suppression();
elseif ($_GET['action'] == "supprimer") Modules::supprimer();
elseif ($_GET['action'] == "monter") Modules::monter();
elseif ($_GET['action'] == "descendre") Modules::descendre();
else Modules::afficher();
}

[...]

// Gestion des inscrits
if ($_GET['sousmenu'] == "inscrits") {
if ($_POST['action'] == "modifier") Inscrits::modifier();
elseif ($_GET['action'] == "modification") Inscrits::modification();
elseif ($_GET['action'] == "suppression") Inscrits::suppression();
elseif ($_GET['action'] == "supprimer") Inscrits::supprimer();
else Inscrits::afficher();
}

//===================================================================
// SALARIES
//===================================================================

// Gestion des commissions
if ($_GET['sousmenu'] == "commissions") {
Commissions::afficher();
}

//===================================================================
// OPTIONS
//===================================================================

// Gestion des utilisateurs
if ($_GET['sousmenu'] == "utilisateurs") {
if ($_POST['action'] == "modifier") Utilisateurs::modifier();
elseif ($_GET['action'] == "modification") Utilisateurs::modification();
elseif ($_GET['action'] == "suppression") Utilisateurs::suppression();
elseif ($_GET['action'] == "supprimer") Utilisateurs::supprimer();
else Utilisateurs::afficher();
}
}
}


Comme on peut le voir, c'est assez bête parce qu'en fait il n'existe que 8 ou 9 fonctions types dans chacune de mes classes, je me retrouve avec une page de 300 lignes de conditionnel qui pourrait peut-être être automatisé...

Jny
08/02/2007, 12h09
Un truc du genre ?


if (isset($_GET['action'])) {
$nomAction = $_GET['action'];
} else {
$nomAction = "ActionParDefaut";
}

$action = new $nomAction(); // Création d'une instance à partir du nom de la classe

$action->execute(); // lancement de l'action

fornight
08/02/2007, 13h37
J'ai fait un test en adaptant et ça marche, merci beaucoup Jny ! Déjà ça optimise largement ma classe Page. En fait, je n'avais pas compris à quoi servaient les instances.

Pour info, j'ai dit une bétise : sur ce serveur, j'ai fait une mise à jour qui me donne les deux version de php et la version 5 par défaut.

Maintenant, je peux passer au problème suivant :

Je vais avoir plus de mal à le décrire mais en clair j'ai créée une fonction qui possède pas mal d'options de manière à ce que je puisse afficher et ordonner n'importe quel table MySQL. D'ailleurs si cette fonction peut aider quelqu'un, tant mieux (mais elle n'est pas assez commentée).

Voilà la fameuse fonction :


//==========================================================================
// GENERATION DE TABLEAU DE GESTION DES DONNEES
//==========================================================================

function tableauGenerer($tableNom, $tableColonnes, $tableConditions, $tableTri, $tableId, $tableDroits, $tableOptions)
{
// Variables par defaut
if ($_GET['tableTri'] != NULL) $tableTri = $_GET['tableTri'];
if ($_GET['tableOrdre'] == NULL) $tableOrdre = "ASC";
else $tableOrdre = $_GET['tableOrdre'];
if ($_GET['tableNombre'] == NULL) $tableNombre = 50; // Nombre d'enregistrements par page par defaut
else $tableNombre = $_GET['tableNombre'];
if ($_GET['tablePage'] == NULL) $tablePage = 1;
else $tablePage = $_GET['tablePage'];
if (isset($_GET['table_option_choix'])) $_SESSION['table_option_choix'] = $_GET['table_option_choix'];

// Construction de l'url complementaire
$_SESSION['url2'] = '&amp;tableTri=' . $tableTri . '&amp;tableOrdre=' . $tableOrdre;

//==============================================================
// RECHERCHE DE DONNEES
//==============================================================

if ($_POST['action'] == "rechercher") {

$tableMotcle = $_POST['tableMotcle'];
for ($i=0; $i<count($tableColonnes); $i++) {
if ($i == 0) {
$tableConditions = " WHERE " . $tableColonnes[$i] . " LIKE '%" . $tableMotcle . "%'";
if (isset($_SESSION['table_option_choix'])) $tableConditions .= " AND " . $tableOptions['table_option_choix'] . " = '" . $_SESSION['table_option_choix'] . "'";
} else {
$tableConditions .= " OR " . $tableColonnes[$i] . " LIKE '%" . $tableMotcle . "%'";
if (isset($_SESSION['table_option_choix'])) $tableConditions .= " AND " . $tableOptions['table_option_choix'] . " = '" . $_SESSION['table_option_choix'] . "'";
}
}

$tableMotcle_1 = strtoupper($tableMotcle);
for ($i=0; $i<count($tableColonnes); $i++) {
$tableConditions .= " OR " . $tableColonnes[$i] . " LIKE '%" . $tableMotcle_1 . "%'";
if (isset($_SESSION['table_option_choix'])) $tableConditions .= " AND " . $tableOptions['table_option_choix'] . " = '" . $_SESSION['table_option_choix'] . "'";
}

$tableMotcle_2 = strtolower($tableMotcle);
for ($i=0; $i<count($tableColonnes); $i++) {
$tableConditions .= " OR " . $tableColonnes[$i] . " LIKE '%" . $tableMotcle_2 . "%'";
if (isset($_SESSION['table_option_choix'])) $tableConditions .= " AND " . $tableOptions['table_option_choix'] . " = '" . $_SESSION['table_option_choix'] . "'";
}

$tableMotcle_3 = strtr($tableMotcle, "áéíóúàèìòùâêîôûäëïöü", "aeiouaeiouaeiouaeiou");
for ($i=0; $i<count($tableColonnes); $i++) {
$tableConditions .= " OR " . $tableColonnes[$i] . " LIKE '%" . $tableMotcle_3 . "%'";
if (isset($_SESSION['table_option_choix'])) $tableConditions .= " AND " . $tableOptions['table_option_choix'] . " = '" . $_SESSION['table_option_choix'] . "'";
}

$tableMotcle_4 = strtoupper($tableMotcle_3);
for ($i=0; $i<count($tableColonnes); $i++) {
$tableConditions .= " OR " . $tableColonnes[$i] . " LIKE '%" . $tableMotcle_4 . "%'";
if (isset($_SESSION['table_option_choix'])) $tableConditions .= " AND " . $tableOptions['table_option_choix'] . " = '" . $_SESSION['table_option_choix'] . "'";
}
} else {
if (isset($_SESSION['table_option_choix'])) {
$tableConditions .= " WHERE " . $tableOptions['table_option_choix'] . " = '" . $_SESSION['table_option_choix'] . "'";
}
}

//==============================================================
// CONSTRUCTION DE LA REQUETE MYSQL
//==============================================================

$requeteSource = "SELECT * FROM " . $tableNom . $tableConditions . " ORDER BY " . $tableTri . " " . $tableOrdre;

if ($tableNombre != NULL) {
$resultatsNombre = mysql_num_rows(mysql_query($requeteSource));
$pagesNombre = ceil($resultatsNombre / $tableNombre);
$requeteSource .= " LIMIT " . (($tablePage - 1) * $tableNombre) . " , " . $tableNombre;
}

//==============================================================
// AFFICHAGE DU MENU DE TABLEAU
//==============================================================

if (substr($tableDroits, 1, 1) == 1) {
echo '<p align="right">' . "\n";
echo ' <a href="' . $_SESSION['url'] . '&amp;action=ajout" class="bouton">' . traduire("bouton_ajout_".$tableNom) . '</a>' . "\n";
echo '</p>' . "\n";
}

echo '<table id="tableauMenu">' . "\n";
echo ' <tr>' . "\n";
echo ' <td>' . "\n";
echo ' <form name="formulaireRecherche" method="post">' . "\n";
echo ' <input type="text" name="tableMotcle" />' . "\n";
echo ' <input name="action" type="hidden" value="rechercher" />' . "\n";
echo ' <a href="javascript:document.formulaireRecherche.submit()">' . traduire("bouton_rechercher") . '</a>' . "\n";
echo ' </form>' . "\n";
echo ' </td>' . "\n";

if (isset($tableOptions['table_option_choix'])) { // Si l'option de choix est remplie
echo ' <td>' . "\n";
echo ' <form name="formulaireChoix">' . "\n";
echo ' ' . traduire('table_option_choix_' . $tableOptions['table_option_choix']) . ' : ' . "\n";
echo ' <select name="table_option_choix" onChange="pageAfficher2(formulaireChoix)">' . "\n";
echo ' <option>&nbsp;</option>' . "\n";

for ($i=1; $i<=(count($_SESSION['table_option_choix_tableau'])/2); $i++) {
echo ' <option value="' . $_SESSION['url'] . $_SESSION['url2'] . '&amp;table_option_choix=' . $_SESSION['table_option_choix_tableau'][$i+10] . '"';
if ($_SESSION['table_option_choix_tableau'][$i+10] == $_SESSION['table_option_choix']) echo ' selected';
echo '>' . $_SESSION['table_option_choix_tableau'][$i] . '</option>' . "\n";
}
echo ' </select>' . "\n";
echo ' </form>' . "\n";
echo ' </td>' . "\n";
}

if ($pagesNombre > 1) { // Si le resultat s'affiche sur plusieurs pages
echo ' <td id=tableauMenuPages>' . "\n";
echo ' <form>' . "\n";
echo ' ALLER A LA PAGE : ' . "\n";
echo ' <select name="tablePage" onChange="pageAfficher(this.form)">' . "\n";
echo ' <option>&nbsp;</option>' . "\n";
for ($i=1; $i<=$pagesNombre; $i++) {
echo ' <option value="' . $_SESSION['url'] . $_SESSION['url2'] . '&amp;tablePage=' . $i . '"';
if ($i == $tablePage) echo ' selected';
echo '>' . $i . '</option>' . "\n";
}
echo ' </select>' . "\n";
echo ' </form>' . "\n";
echo ' </td>' . "\n";
}

echo ' </tr>' . "\n";
echo '</table>' . "\n";

//==============================================================
// AFFICHAGE DU TABLEAU
//==============================================================

// Option : Cases a cocher
if ($tableOptions[''] == 1) echo '<form name="formulaireTableau">' . "\n";

echo '<table id="tableau" cellspacing="1">' . "\n";
echo ' <tr id="tableauEntete">' . "\n";

// Option : Cases a cocher
if ($tableOptions['table_option_selection'] == 1) echo ' <td width="26">&nbsp;</td>' . "\n";

// Affichage de la ligne d'entete
for ($i=0; $i<count($tableColonnes); $i++) {
echo ' <td><a href="' . $_SESSION['url'] . '&amp;tableTri=' . $tableColonnes[$i];
if ($tableColonnes[$i] == $tableTri && $tableOrdre == "ASC") echo '&amp;tableOrdre=DESC">';
else echo '&amp;tableOrdre=ASC">';
echo traduire($tableColonnes[$i]);
if ($tableColonnes[$i] == $tableTri) echo '<img src="medias/images/' . $tableOrdre . '.gif" />';
echo '</a></td>' . "\n";
}

// Affichage des colonnes vides
if (substr($tableDroits, 4, 1) == 1) echo ' <td width="26">&nbsp;</td>' . "\n" . ' <td width="26">&nbsp;</td>' . "\n";
if (substr($tableDroits, 2, 1) == 1) echo ' <td width="26">&nbsp;</td>' . "\n";
if (substr($tableDroits, 3, 1) == 1) echo ' <td width="26">&nbsp;</td>' . "\n";

echo ' </tr>' . "\n";

// Option : Cases a cocher
if ($tableOptions['table_option_selection'] == 1) $j = 0;

$requeteResultat = mysql_query($requeteSource);
while ($requeteValeur = mysql_fetch_array($requeteResultat)) {

echo ' <tr class="tableauContenu">' . "\n";

// Option : Cases a cocher
if ($tableOptions['table_option_selection'] == 1) {
echo ' <td><input type="checkbox" name="case_' . $j . '" value="' . $requeteValeur[$tableId] . '" /></td>' . "\n";
$j++;
}

for ($i=0; $i<count($tableColonnes); $i++) {

// Impositions conditionnelles
echo ' <td>' . ucfirst($requeteValeur[$tableColonnes[$i]]) . '</td>' . "\n";

}

// Affichage du menu des droits
if (substr($tableDroits, 4, 1) == 1) echo ' <td><u><a href="' . $_SESSION['url'] . '&amp;' . $tableId . '=' .$requeteValeur[$tableId] . '&amp;action=monter"><img src="medias/images/btn_monter.gif" /></a></u></td>' . "\n" . ' <td><u><a href="' . $_SESSION['url'] . '&amp;' . $tableId . '=' .$requeteValeur[$tableId] . '&amp;action=descendre"><img src="medias/images/btn_descendre.gif" /></a></u></td>' . "\n";
if (substr($tableDroits, 2, 1) == 1) echo ' <td><u><a href="' . $_SESSION['url'] . '&amp;' . $tableId . '=' .$requeteValeur[$tableId] . '&amp;action=modification"><img src="medias/images/btn_editer.gif" /></a></u></td>' . "\n";
if (substr($tableDroits, 3, 1) == 1) echo ' <td><u><a href="' . $_SESSION['url'] . '&amp;' . $tableId . '=' .$requeteValeur[$tableId] . '&amp;action=suppression"><img src="medias/images/btn_supprimer.gif" /></a></u></td>' . "\n";

echo ' </tr>' . "\n";
}

echo '</table>' . "\n";

// Option : Modification d'etat
if (isset($tableOptions['table_option_etat'])) {
echo '<p>' . "\n";
echo ' ' . traduire("selection_modifier") . ' : ' . "\n";
echo ' <select name="table_option_etat">' . "\n";
echo ' <option>&nbsp;</option>' . "\n";

for ($i=1; $i<=(count($_SESSION['table_option_etat_tableau'])/2); $i++) {
echo ' <option value="' . $_SESSION['table_option_etat_tableau'][$i+10] . '">' . $_SESSION['table_option_etat_tableau'][$i] . '</option>' . "\n";
}
echo ' </select>' . "\n";

// Option : Modification d'etat 2
if (isset($tableOptions['table_option_etat_2'])) {
echo ' <select name="table_option_etat_2">' . "\n";
echo ' <option>&nbsp;</option>' . "\n";

for ($i=1; $i<=(count($_SESSION['table_option_etat_2_tableau'])/2); $i++) {
echo ' <option value="' . $_SESSION['table_option_etat_2_tableau'][$i+10] . '">' . $_SESSION['table_option_etat_2_tableau'][$i] . '</option>' . "\n";
}
echo ' </select>' . "\n";
echo ' <a href="#" class="bouton">OK</a>' . "\n";
echo '</p>' . "\n";
} else {
echo ' <a href="#" class="bouton">OK</a>' . "\n";
echo '</p>' . "\n";
}
}

// Option : Cases a cocher
if ($tableOptions['table_option_selection'] == 1) echo '</form>' . "\n";
}

fornight
08/02/2007, 13h40
Et voilà un exemple d'appel de cette fonction qui utilise une partie de ses options :


function afficher()
{
$tableNom = "gestion_produits";
$tableColonnes = array("produit_reference", "produit_nom", "fournisseur_nom", "produit_format", "produit_type", "produit_quantite", "produit_achat_prix", "produit_vente_prix", "produit_vente_prix_encadre", "produit_lieu", "produit_etat");
$tableTri = "produit_nom";
$tableId = "produit_id";
$tableDroits = "01110";
$tableOptions = array(
"table_option_choix" => "produit_type",
"table_option_selection" => "1",
"table_option_etat" => "produit_lieu",
"table_option_etat_2" => "produit_etat"
);

$_SESSION['table_option_choix_tableau'] = array(
"1" => "Peinture",
"2" => "Sculpture",
"3" => "Oeuvre sur papier",
"4" => "Livre",
"11" => "peinture",
"12" => "sculpture",
"13" => "oeuvre sur papier",
"14" => "livre"
);

// Transfert de produits

$_SESSION['table_option_etat_tableau'] = array(
"1" => "Agen",
"2" => "Moissac",
"3" => "Toulouse",
"11" => "agen",
"12" => "moissac",
"13" => "toulouse",
);

$_SESSION['table_option_etat_2_tableau'] = array(
"1" => "Expos&eacute;",
"2" => "Restitu&eacute;", // Restitution de produits
"11" => "expose",
"12" => "restitue",
);

tableauGenerer($tableNom, $tableColonnes, $tableConditions, $tableTri, $tableId, $tableDroits, $tableOptions);
}


Je l'ai fait en deux posts par peur que ce soit trop long.... mon problème actuel est que je dois ajouter d'autres options à ce genre de fonction et c'est là que je me demandais si la programmation objet peut aider à ça.