Poo avec php, interaction entre objets

Poo avec php, interaction entre objets - PHP - Programmation

Marsh Posté le 03-09-2011 à 12:40:14    

Bonjour,
 
Je cherche à développer un site avec php en poo.
J'ai lu beaucoup de tuto à ce sujet, mais comme bien souvent les exemples sont trés théoriques et peu transposable à un projet concret. Bref...
 
J'ai cru comprendre qu'il faut considérer mysql comme un objet, et j'ai donc récupérer une classe php trés bien faite sur github (pourquoi réinventer la roue ?)
 
Du coup je m'attaque à mon objet "article" et je me rend compte que pour manipuler mes articles (affichage notament) j'ai besoin "d'actions" avec mysql : logique.
De trés bon tutos et dépots sur github, font directement appels dans l'objet "article" à des requetes sql.
 
Seulement si demain je change ma class mysql, je vais devoir modifier tout mes objets (objet article) qui y fait appel... et du coup mes "objets" ne sont plus manipulable indépendamment des uns des autres...
 
Je ne sais pas si je suis trés clair, mais j'aimerai avoir votre avis et votre façon de procéder :jap:


---------------
Créer son forum gratuit |  Mon beau blog phpBB caÿ le mal :o
Reply

Marsh Posté le 03-09-2011 à 12:40:14   

Reply

Marsh Posté le 03-09-2011 à 13:57:24    

Hello,
 
Je commence juste le dév en POO pour ma part. Je n'y connaissais pas grand chose, mais j'ai suivi un tuto (en anglais) qui m'a bien aidé ces temps-ci :
 
http://www.elated.com/articles/cms [...] php-mysql/
 
Le mec explique comment créer une classe "Article" de base avec différents paramètres. Perso j'ai adapté tout ça pour créer d'autres classes (des produits et des revendeurs dans mon cas) et c'est assez souple à utiliser je trouve !
 
Donc, en prenant l'exemple de ce tuto, si demain tu dois modifier ta classe "Article", il te faudra renommer toutes les références à celles-ci sur les pages où tu y fais référence, c'est-à-dire dans ce cas précis les pages index.php et admin.php qui rassemblent les différentes fonctions et font référence aux méthodes utilisées dans ta classe (je sais pas si je suis très clair  :lol: )
 
Enfin voilà, le mieux encore est de tester et de bidouiller soi-même quelques heures pour bien en comprendre les mécanismes !


---------------
"Goldie."
Reply

Marsh Posté le 03-09-2011 à 15:35:32    

Merci pour le lien, en effet c'est un trés bon tuto bien parlant et je retrouve dedans mon interrogation :  
 
Dans la class Article -> function delete j'ai un  

Code :
  1. $conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
  2.     $st = $conn->prepare ( "DELETE FROM articles WHERE id = :id LIMIT 1" );


 
mais si demain, je change ma class qui gère mysql, je vais devoir éditer tous les appels à la précédente class ?


---------------
Créer son forum gratuit |  Mon beau blog phpBB caÿ le mal :o
Reply

Marsh Posté le 03-09-2011 à 15:43:10    

ben ouais, si tu remplaces une classe par une autre, forcément tu risques de devoir faire des modifications au niveau de tout ce qui faisait appel à cette classe.

Message cité 1 fois
Message édité par caribouuu le 03-09-2011 à 15:44:11

---------------
Bla (blaa bbla)
Reply

Marsh Posté le 03-09-2011 à 16:04:50    

Tu pourrais faire hériter tes classes d'une classe DB qui gèrerait les actions ? Ou utiliser un ORM (propel, doctrine...) ?


---------------
oui oui
Reply

Marsh Posté le 06-09-2011 à 20:19:08    

scull a écrit :

Merci pour le lien, en effet c'est un trés bon tuto bien parlant et je retrouve dedans mon interrogation :  
 
Dans la class Article -> function delete j'ai un  

Code :
  1. $conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
  2.     $st = $conn->prepare ( "DELETE FROM articles WHERE id = :id LIMIT 1" );


 
mais si demain, je change ma class qui gère mysql, je vais devoir éditer tous les appels à la précédente class ?


Avec ton PDO, tu n'es pas dépendant du DBMS. J'ai peut-être pas bien compris mais "delete" est une méthode de "Article", non?
 
Au sinon tu peux découpler ton entité Article des opérations accès DB, façon JEE, et te retrouver avec un anemic domain model qui n'a heureusement pas encore la cote en PHP.
 
Il y a toujours une balance à faire entre découplage à l'extrême (avec complexité accrue) et risque de devoir faire des modifs (avec complexité moindre au départ)


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 07-09-2011 à 11:31:28    

scull a écrit :

mais si demain, je change ma class qui gère mysql, je vais devoir éditer tous les appels à la précédente class ?


 

caribouuu a écrit :

ben ouais, si tu remplaces une classe par une autre, forcément tu risques de devoir faire des modifications au niveau de tout ce qui faisait appel à cette classe.


 
Si c'est une de tes grandes préoccupations, je te suggère de bâtir ton projet autour d'un injecteur de dépendances. Deux exemples ici :
http://pimple.sensiolabs.org/
https://github.com/symfony/DependencyInjection (L'injecteur de dépendance de Symfony2, mais étant donné qu'il n'a pas de documentation intégrée tu risques de galérer à l'intégrer)


---------------
Mon Feedback !
Reply

Marsh Posté le 14-09-2011 à 19:25:32    

provencal_le_gaulois a écrit :

Hello,
 
Je commence juste le dév en POO pour ma part. Je n'y connaissais pas grand chose, mais j'ai suivi un tuto (en anglais) qui m'a bien aidé ces temps-ci :
 
http://www.elated.com/articles/cms [...] php-mysql/
 
Le mec explique comment créer une classe "Article" de base avec différents paramètres. Perso j'ai adapté tout ça pour créer d'autres classes (des produits et des revendeurs dans mon cas) et c'est assez souple à utiliser je trouve !
 
Donc, en prenant l'exemple de ce tuto, si demain tu dois modifier ta classe "Article", il te faudra renommer toutes les références à celles-ci sur les pages où tu y fais référence, c'est-à-dire dans ce cas précis les pages index.php et admin.php qui rassemblent les différentes fonctions et font référence aux méthodes utilisées dans ta classe (je sais pas si je suis très clair  :lol: )
 
Enfin voilà, le mieux encore est de tester et de bidouiller soi-même quelques heures pour bien en comprendre les mécanismes !


Merci pour ce trés bon lien cher Avignonais ;)
 
J'ai commencé à créer d'autre classe à partir de la classe Article, et j'ai notamment déplacer la connexion PDO. Du coup je l'incorpore avec un "global $conn;"
 
Par contre j'ai un message étrange "Fatal error: Call to a member function prepare() on a non-object" on line 45
 
 

Code :
  1. public static function getList( $numRows=1000000, $order="publicationDate DESC" ) {
  2.     //$conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
  3.     global $conn;
  4.     $sql = "SELECT SQL_CALC_FOUND_ROWS *, FROM cat
  5.             ORDER BY " . mysql_escape_string($order) . " LIMIT :numRows";
  6.     $st = $conn->prepare( $sql );
  7.     $st->bindValue( ":numRows", $numRows, PDO::PARAM_INT );
  8.     $st->execute();
  9.     $list = array();
  10.     while ( $row = $st->fetch() ) {
  11.       $article = new Categorie( $row );
  12.       $list[] = $article;
  13.     }
  14.     // Now get the total number of articles that matched the criteria
  15.     $sql = "SELECT FOUND_ROWS() AS totalRows";
  16.     $totalRows = $conn->query( $sql )->fetch();
  17.     $conn = null;
  18.     return ( array ( "results" => $list, "totalRows" => $totalRows[0] ) );
  19.   }


 
Etrange car si je remet la ligne de connexion PDO, je n'ai plus le message... Une idée ?


---------------
Créer son forum gratuit |  Mon beau blog phpBB caÿ le mal :o
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed