Partage
  • Partager sur Facebook
  • Partager sur Twitter

Premier mini-projet réel en POO MVC

Débogage et recherche de conseils de professionnel pour évoluer

    28 mai 2017 à 20:01:12

    Bonsoir,

    https://openclassrooms.com/forum/sujet/conception-d-une-application-totalement-en-poo-mvc

    Ce sujet fait suite à celui-ci dessus. Le but est de développer de la meilleure façon possible. J'avais appris à créer une application Web simple 10 ans auparavant. Aujourd'hui, je dois apprendre la POO, l'évolution de la conception, ... en quasi totale autonomie. J'ai vraiment une possibilité d'emploi à long terme. L'entreprise est assez réduite (familiale). L'ambiance est excellente.

    Cependant, je vais devoir intégrer la réalisation de tâches de plusieurs domaines différents. J'ai des notions (infographie, comptabilité, ...) ou de vieilles bases dans pas mal de domaines (Web, C (appris avec mon père), ...). Ensuite, j'ai d'excellentes compétences en secrétariat (expériences administratives diverses et formation supérieure quasi finie (BAC+3)).

    Je galère avec le débogage de la POO. Je reprends une classe fonctionnelle dans un autre projet. Malheureusement, celle-ci plante dans le nouveau. J'ai vérifié ligne par ligne par rapport à l'autre projet. Je ne trouve pas d'erreurs. J'ai commencé à modifier la classe (suivant le message d'erreur). D'autres problèmes apparaissent. Donc, je voudrais votre avis avant d'aller plus loin. La classe est Chargement.

    Fatal error: Constructor Chargement::chargement() cannot be static in ... on line 79. J'ai testé cette modification: function chargement($nomClasse). Malencontreusement, j'ai pleins d'erreurs. La classe fonctionne dans l'autre projet. Dès lors, elle devrait marcher aussi.

    Est-ce normal qu'une classe fonctionnant dans un projet ne fonctionne plus dans un nouveau?

    Est-ce que vous voyez le problème?

    Je n'ai presque pas dormi. Je dois présenter le mini-projet demain. Même s'il n'est pas fini, j'aimerais qu'il ne plante pas. En outre, je voudrais savoir si ma façon de commenter mes classes est correcte. Ils développent principalement des applications JAVA avec Eclipse. Certains commentaires se font automatiquement après avoir créer une classe ou une fonction lorsqu'ils indiquent /** (auteur, paramètres, retour, ...).

    Comment obtient-on les commentaires automatiques avec NetBeans IDE 8?

    Faut-il plus de commentaires ou y en a-t-il de trop?

    Dois-je mettre des commentaires à chaque fonction set... ou get... (anticipation de la documentation développeur, ...)?

    Comment génère-t-on une documentation automatique via les commentaires?

    Certaines parties ne sont pas finies. Je dois créer un contrôleur générique. Les autres contrôleurs l'étendront. Je dois aussi créer la vue. J'utilise un parseur. Donc, je me dis que ce n'est peut-être pas nécessaire de se prendre la tête. Un MVC total permet d'être mieux compris. Néanmoins, on se retrouve avec beaucoup de classes pour pas grand chose.

    Pourriez-vous me donner votre avis sur ma conception?

    Je ne vois pas la manière de concevoir le contrôleur frontal. Toutes les vérifications doivent s'effectuer à cet endroit. Cela me semble quand même complexe. Un autre point qui me pose souci, ce sont les propriétés. Dans du procédural comme tout est dans les variables, on ne se prend pas la tête.

    Auriez-vous un exemple de contrôleur frontal gérant un formulaire de connexion, ...?

    Comment être sûr que ses classes ont toutes les propriétés (base de données, partie du HTML (<h4>Contenu</h4>) de ma fonction creerHTML() de ma classe Message, ...)?

    D'avance, je vous remercie énormément pour vos conseils.

    BONNE SOIRÉE

    BASE DE DONNÉES

    CREATE DATABASE IF NOT EXISTS mini_projet;
    USE mini_projet;
    # -----------------------------------------------------------------------------
    #       TABLE : UTILISATEUR
    # -----------------------------------------------------------------------------
    
    CREATE TABLE IF NOT EXISTS UTILISATEUR
     (
       PSEUDO VARCHAR(50) NOT NULL  ,
       MOT_DE_PASSE VARCHAR(255) NOT NULL  
       , PRIMARY KEY (PSEUDO) 
     ) 
     comment = "";
    
    # -----------------------------------------------------------------------------
    #       TABLE : MESSAGE
    # -----------------------------------------------------------------------------
    
    CREATE TABLE IF NOT EXISTS MESSAGE
     (
       ID_MESSAGE BIGINT(4) NOT NULL AUTO_INCREMENT ,
       PSEUDO VARCHAR(50) NOT NULL  ,
       TITRE VARCHAR(50) NOT NULL  ,
       CONTENU TEXT NOT NULL  
       , PRIMARY KEY (ID_MESSAGE) 
     ) 
     comment = "";
    
    # -----------------------------------------------------------------------------
    #       INDEX DE LA TABLE MESSAGE
    # -----------------------------------------------------------------------------
    
    CREATE  INDEX I_FK_MESSAGE_UTILISATEUR
         ON MESSAGE (PSEUDO ASC);
    
    
    # -----------------------------------------------------------------------------
    #       CREATION DES REFERENCES DE TABLE
    # -----------------------------------------------------------------------------
    
    ALTER TABLE MESSAGE 
      ADD FOREIGN KEY FK_MESSAGE_UTILISATEUR (PSEUDO)
          REFERENCES UTILISATEUR (PSEUDO) ;
    
    INSERT INTO utilisateur (pseudo, mot_de_passe) VALUES ('Manon', 'LectricePassionnée');
    INSERT INTO utilisateur (pseudo, mot_de_passe) VALUES ('Sophie', 'AssistanteMotivée');
    INSERT INTO utilisateur (pseudo, mot_de_passe) VALUES ('Paul', 'PatronFlexibleJuste');
    INSERT INTO utilisateur (pseudo, mot_de_passe) VALUES ('Linda', 'ArtisteExtraordinaire');
    INSERT INTO utilisateur (pseudo, mot_de_passe) VALUES ('Xavier', 'DéveloppeurSeniorExigeant');
    INSERT INTO utilisateur (pseudo, mot_de_passe) VALUES ('Christian', 'EncyclopédieVivante');
    INSERT INTO utilisateur (pseudo, mot_de_passe) VALUES ('Quentin', 'DéveloppeurJuniorPatient');
    INSERT INTO utilisateur (pseudo, mot_de_passe) VALUES ('Christelle', 'ComptableEngagée');
    
    INSERT INTO message (id_message, pseudo, titre, contenu) VALUES (1, 'Manon', 'Nouvelles lectures', 'Maman, j\'ai trouvé des nouvelles aventures d\'Harry Potter écrites par des fans. Pourrais-tu jeter un coup d\'œil pour savoir si elles sont correctement écrites? MERCI ET BISOUS');
    INSERT INTO message (id_message, pseudo, titre, contenu) VALUES (2, 'Sophie', 'Encouragements', 'Ma chérie, je regarderai cela avec toi. Néanmoins, je suis fort occupée pour le moment. Pourquoi n\'imprimes-tu pas quelques pages? Tu dois essayer de trouver les fautes toi-même. C\'est un des meilleurs exercices pour apprendre.');
    INSERT INTO message (id_message, pseudo, titre, contenu) VALUES (3, 'Paul', 'Motivation', 'J\'ai toute de suite repéré ta motivation. Tu as même réussi à convaincre Xavier. Tu as les cartes dans tes mains.');
    INSERT INTO message (id_message, pseudo, titre, contenu) VALUES (4, 'Linda', 'Collaboration', 'Je me réjouis de cette collaboration. Enfin, une femme qui démontre que tout est possible. Je suis à ta disposition pour le côté graphique. Je suis toujours des études. Donc, je viens quand je peux.');
    INSERT INTO message (id_message, pseudo, titre, contenu) VALUES (5, 'Xavier', 'Surprise', 'Lorsque tu es arrivée, j\'étais assez septique. La nouvelle génération d\'adultes manque parfois de motivation. Surtout que tes connaissances en programmation n\'étaient pas du tout à jour. Tu m\'as agréablement surpris. C\'est mon rôle d\'être exigeant. Je travaille en parallèle dans une grande entreprise. Dès lors, je connais l\'importance de se mettre à jour, de rester performant, ... Si tu arrives à suivre mes consignes, tu resteras.');
    INSERT INTO message (id_message, pseudo, titre, contenu) VALUES (6, 'Christian', 'Conseils', 'Si tu as besoin d\'un conseil, je suis là. J\'ai été ravi par ton arrivée. Tu me fais penser à ma petite fille. Ce qui ne me rajeunit pas.');
    INSERT INTO message (id_message, pseudo, titre, contenu) VALUES (7, 'Quentin', 'Écoute', 'Je reste à ton écoute pour ton évolution. Par contre, tu vas devoir prouver à Xavier que Paul a vu juste. J\'avais de bien meilleures compétences par rapport à toi à mon arrivée. En revanche, il m\'a fallu un temps d\'adaptation. Code tous les jours en évitant de te prendre la tête.');
    INSERT INTO message (id_message, pseudo, titre, contenu) VALUES (8, 'Christelle', 'Engagement', 'Il n\'est pas toujours simple de rejoindre une petite entreprise. Souvent, cela demande un plus grand engagement. Même si le salaire est plus réduit, la satisfaction est plus grande. Je tiens d\'avance à m\'excuser. Tu vas avoir encore plus de boulot lorsque je serai en repos d\'accouchement. Tiens le coup.');

    VERSION STATIQUE (testGraphique.html)

    <!DOCTYPE html>
    <!-- 
        La vue testGraphique.html gère la structure sémantique (organisation) de la page d'accueil 
        de l'application Web. Elle permet de tester rapidement (développement statique) la partie 
        graphique de l'application.
        @author Sophie
    -->
    <html lang="fr">
        <head>
            <title>Mini-Projet</title>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <link rel="stylesheet" href="styles.css" />
        </head>
        <body>
            <section id="principal">
                <header>
                    <h1>Mini-Projet</h1>
                </header>
                <section id="contenu">
                    <h2>Titre: Avancement</h2>
                    <h3>Auteur: Béatrice</h3>
                    <h4>Contenu</h4>
                    <div>Je voulais te féliciter pour ton avancement.</div>
                </section>
                <footer>
                    <p>Cette application est développée par Sophie Evolution.</p>
                </footer>
            </section>
        </body>
    </html>
    

    CSS (styles.css)

    body
    {
    	background: #EEEEEE;
    	font-family: verdana, sans-serif;
    	font-size: 1.2em;
    	color: #000000;
    	margin: 0 auto;
    	padding: 0;
    	width: 90%;
    }
    
    h1, h2, h3, h4, div, footer
    {
        padding: 5px;
        border-radius: 5px;
        -webkit-border-radius: 5px;
        -moz-border-radius: 5px;
        margin: 0;
        padding: 10px;
        color: #333333;
    }
    
    h1, footer
    {
        background: blueviolet;
    }
    
    h2
    {
        background: lightseagreen;
    }
    
    h3
    {
        background: lightgreen;
    }
    
    h4
    {
        background: lightcyan;
    }
    div
    {
        background: gainsboro;
    }
    

    VUE TAGUÉE (vueTaguee.html)

    <!DOCTYPE html>
    <!-- 
        La vue vueTaguee.html gère la structure sémantique (organisation) de la page d'accueil 
        de l'application Web. Les tags définissent des blocs. Ceux-ci seront remplacés par un 
        autre contenu de manière dynamique.
        @author Sophie
    -->
    <html lang="fr">
        <head>
            <title>[page_titre]</title>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <link rel="stylesheet" href="styles.css" />
        </head>
        <body>
            <section id="principal">
                <header>
                    <h1>[page_titre]</h1>
                </header>
                <section id="contenu">
                    [contenu]
                </section>
                <footer>
                    [signature]
                </footer>
            </section>
        </body>
    </html>
    

    index.php

    <?php
        require_once 'coeur\constantes.php';
        require_once 'coeur\modeles\Chargement.php';
        
        $chargement = new Chargement();
        $chargement->enregistrement();
        $message = new Message();
        $listeMessages = $message->creerHTML();    
        
        // Je crée un tableau avec les tags.
        $tableauDepart = array
        (
            '[page_titre]', 
            '[contenu]', 
            '[signature]' 
        );
        
        // Je crée un tableau avec les remplacements.
        $tableauArrivee = array
        (
            'Mini-Projet', 
            $listeMessages, 
            '<p>Cette application est développée par Sophie Evolution.</p>' 
        );

    coeur\constantes.php

    <?php
        // CONSTANTES DE CONNEXION À LA BASE DE DONNÉES
        define('BD_HOTE', 'localhost');
        define('BD_UTILISATEUR', 'root');
        define('BD_MDP', '');
        define('BD_NOM', 'mini_projet');  
        // CONSTANTES DES DOSSIERS DE L'APPLICATION
        define('RACINE_SERVEUR', $_SERVER['DOCUMENT_ROOT']);
        define('REQUEST_URI', $_SERVER['REQUEST_URI']);
        define('RACINE_APPLICATION', RACINE_SERVEUR . REQUEST_URI);
        define('COEUR_MODELES', RACINE_APPLICATION . '/coeur/modeles/');
        define('APPLICATION_MODELES', RACINE_APPLICATION . '/application/modeles/');
        define('APPLICATION_CONTROLEURS', RACINE_APPLICATION . '/application/controleurs/');
        define('APPLICATION_GESTIONNAIRES', RACINE_APPLICATION . '/application/gestionnaires/');
        define('APPLICATION_VUES', RACINE_APPLICATION . '/application/vues/');    

    coeur\modeles\Base.php

    <?php
        /**
         * Ce modèle Base gère le constructeur et l'hydratation des 
         * autres modèles.
         * @author Sophie
         */
        class Base
        {
            function __construct(array $donnees = null)
            {
                if($donnees)
                {
                    $this->hydrater($donnees);
                }
            }
            public function hydrater(array $donnees)
            {
                foreach ($donnees as $propriete => $valeur )
                {
                    $nomMethode = 'set' . ucfirst($propriete);
                    if (method_exists($this, $nomMethode))
                    {
                        $this->$nomMethode($valeur);
                    }
                }
            }
        }

    coeur\modeles\Connexion.php

    <?php
        require_once 'Base.php';
        /**
         * Le modèle Connexion gère les connexions à la base de données.
         * @author Sophie
         */
        class Connexion extends Base
        {
            static private $bdHote = BD_HOTE;
            static private $bdUtilisateur = BD_UTILISATEUR;
            static private $bdMotDePasse = BD_MDP;
            static private $bdNom = BD_NOM;
            
            static private $chaine;
            static private $parametres;    
            static private $connexion;
            
            // Le contructeur a été défini dans la classe mère (Base).
            
            static function setBdHote($bdHote)
            {
                self::$bdHote = $bdHote;
            }
    
            static function setBdUtilisateur($bdUtilisateur)
            {
                self::$bdUtilisateur = $bdUtilisateur;
            }
    
            static function setBdMotDePasse($bdMotDePasse)
            {
                self::$bdMotDePasse = $bdMotDePasse;
            }
            
            static function setBdNom($bdNom)
            {
                self::$bdNom = $bdNom;
            }
    
            static function setChaine()
            {
                self::$chaine = "mysql:host=" . self::$bdHote . "; dbname=" . self::$bdNom;
            }
    
            static function setParametres()
            {
                self::$parametres = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
            }
    
            static function setConnexion()
            {
                self::setChaine();
                self::setParametres();  
    
                try
                {
                    self::$connexion = new PDO(self::$chaine, self::$bdUtilisateur, self::$bdMotDePasse, self::$parametres);
                }
                catch(Exception $exception)
                {
                    echo 'La tentative a échouée. Le message d\'erreur est ' . $exception->getMessage();
    
                }
            }
            
            static function getConnexion()
            {
                if(is_null(self::$connexion))
                {
                    self::setConnexion();
                }
                return self::$connexion;
            }
            
            static function closeConnexion()
            {
                self::$connexion = null;
            }
        }

    coeur\modeles\Service.php

    <?php
        /**
         * Le modèle Service définit les fonctionnalités 
         * qui seront utilisées à différents endroits de 
         * l'application (parserHTML, ...).
         * @author Sophie
         */
        class Service extends Base
        {
            // PROPRIÉTÉS
            private $listeContenusDepart = array();
            private $listeContenusRemplacement = array();
            private $vueHTML;      
    
    	// Le contructeur a été défini dans la classe mère (Base).
            
            // SETTERS (MODIFICATIONS)
            
            function setListeContenusDepart($listeContenusDepart)
            {
                $this->listeContenusDepart = $listeContenusDepart;
            }
    
            function setListeContenusRemplacement($listeContenusRemplacement)
            {
                $this->listeContenusRemplacement = $listeContenusRemplacement;
            }
            
            function setVueHTML($vueHTML)
            {
                $this->vueHTML = $vueHTML;
            }
                    
            // GETTERS (LECTURES)
            
            function getListeContenusDepart()
            {
                return $this->listeContenusDepart;
            }
    
            function getListeContenusRemplacement()
            {
                return $this->listeContenusRemplacement;
            }
            
            public function getVueHTML()
            {
                return $this->vueHTML;
            }
                   
            // LES AUTRES FONCTIONS
            
            public function parserHTML()
            {
                // Je place les données nécessaires dans des variables.
                $vueHTML = $this->getVueHTML();
                $tags = $this->getListeContenusDepart();
                $remplacements = $this->getListeContenusRemplacement();
                // J'ouvre la vue HTML en lecture seule.
                $ouverture = fopen($vueHTML, 'r');
                // Je définis la taille de la vue HTML.
                $taille = filesize($vueHTML);
                // Je lis le contenu de la vue HTML.
                $contenu = fread($ouverture, $taille);
                // Je ferme la vue HTML.
                fclose($ouverture);
                // Je remplace les tags dans la vue HTML.
                $resultat = str_replace($tags, $remplacements, $contenu);
                // Je retourne le résultat.
                return $resultat;
            }    
        }
    

    coeur\modeles\Chargement.php (classe qui plante)

    <?php
        /**
         * Le modèle Chargement gère le chargement automatique 
         * des classes de toute l'application.
         * @author Sophie
         */
        echo 'REQUEST_URI';
        echo '<br />';
        echo $_SERVER['REQUEST_URI'];
        echo '<br />';
    
        echo 'RACINE_APPLICATION';
        echo '<br />';
        echo RACINE_APPLICATION;
        echo '<br />';
        echo 'COEUR_MODELES';
        echo '<br />';
        echo COEUR_MODELES;
        echo '<br />';
        class Chargement
        {
            const VERIFICATION = 1;
            
            /* CE CODE CI-DESSOUS PLANTE
            if(self::VERIFICATION === 1)
            {
                echo 'VERIFICATIONS';
            }
            */
            
            static function enregistrement()
            {
                if(self::VERIFICATION === 1)
                {
                    echo '<p>Vous entrez dans la fonction enregistrement()</p>';
                }
                spl_autoload_register(array(__CLASS__, 'chargement'));
            }
            
            static function chargement($nomClasse)
            {
                if(self::VERIFICATION === 1)
                {
                    echo '<p>Vous entrez dans la fonction chargement()</p>';
                }
                $nomFichier = $nomClasse . '.php';
    
                $repertoire01 = COEUR_MODELES . $nomFichier;
                if(file_exists($repertoire01))
                {                
                    require_once $repertoire01;
                }
                $repertoire02 = APPLICATION_MODELES . $nomFichier;
                if(file_exists($repertoire02))
                {
                    require_once $repertoire02;
                }
                $repertoire03 = APPLICATION_GESTIONNAIRES . $nomFichier;
                if(file_exists($repertoire03))
                {
                    require_once $repertoire03;
                }
                $repertoire04 = APPLICATION_CONTROLEURS . $nomFichier;
                if(file_exists($repertoire04))
                {
                    require_once $repertoire04;
                }
                $repertoire05 = APPLICATION_VUES . $nomFichier;
                if(file_exists($repertoire05))
                {
                    require_once $repertoire05;
                }
                else
                {
                    echo 'Une erreur s\'est produite lors du chargement automatique de la classe!';
                    echo '<br />';
                }
            }
        }
    



    application\modeles\Message.php

    <?php
        /**
         * Le modèle Message gère les objets message des utilisateurs. 
         * Il permet de créer aussi le HTML de manière dynamique.
         * @author Sophie
         */
        class Message
        {
            // PROPRIÉTÉS
            private $idMessage;
            private $pseudo;
            private $titre;
            private $contenu;
            
            // Le contructeur a été défini dans la classe mère (ModeleGenerique).
            
            function setIdMessage($idMessage)
            {
                $this->idMessage = $idMessage;
            }
    
            function setPseudo($pseudo)
            {
                $this->pseudo = $pseudo;
            }
    
            function setTitre($titre)
            {
                $this->titre = $titre;
            }
    
            function setContenu($contenu)
            {
                $this->contenu = $contenu;
            }
    
            function getIdMessage()
            {
                return $this->idMessage;
            }
    
            function getPseudo()
            {
                return $this->pseudo;
            }
    
            function getTitre()
            {
                return $this->titre;
            }
    
            function getContenu()
            {
                return $this->contenu;
            }
            
            public function creerHTML()
            {
                $gestionnaire = new MessageGestionnaire();            
                $donnees = $gestionnaire->listerMessages();
                $html = '<article>';
                for($i = 0; $i < sizeof($donnees); $i++)
                {
                    $html .= '<h2>Titre: ' . $donnees[$i]->getTitre() . '</h2>';
                    $html .= '<h3>Auteur: ' . $donnees[$i]->getPseudo() . '</h3>';
                    $html .= '<h4>Contenu</h4>';
                    $html .= '<div>' . $donnees[$i]->getContenu() .  '</div>';
                }
                $html .= '</article>';
            }
        }
    

    application\gestionnaires\MessageGestionnaire.php

    <?php
        /**
         * Le gestionnaire MessageGestionnaire réalise la liaison entre 
         * le modele Message et la base de données.
         * @author Sophie
         */
        class MessageGestionnaire
        {
            const NOM_TABLE = 'message';
            
            public function listerMessages()
            {
                $sql = "SELECT * FROM " . self::NOM_TABLE . " ORDER BY id DESC;";
                $rs = Connexion::getConnexion()->query($sql);
                while($r = $rs->fetch(PDO::FETCH_ASSOC))
                {
                    $liste[] = new Message($r);
                }
                $rs->CloseCursor;
                $rs = null;
                return $liste;
            }
        }            

    application\controleurs\MessageControleur.php

    <?php
        /**
         * Le contrôleur MessageControleur réalise le lien entre 
         * le gestionnaire MessageGestionnaire et entre la vue.
         * @author Sophie
         */
        class MessageControleur
        {
            public function listerAction()
            {
                $connexion = new Connexion();
                $gestionnaireMessage = new GestionnaireMessage();
                $donnees = $gestionnaireMessage->listerMessages();
                $message = new Message();
                $listeMessages = $message->creerHTML();
                // $this->setDonneesEnvoyeesVue('liste', 'listeMessages');
            }
        }

    application\vues\

    Ce dossier est vide pour le moment...





    • Partager sur Facebook
    • Partager sur Twitter
      28 mai 2017 à 22:20:14

      Salut, à mon avis il faut présenter un projet qui fonctionne, pour moi c'est le plus important. Après le soucis de bien commenté en suivant bien une convention, ça reste un détail. ça reste mon avis.

      Après pour l'erreur t'as essayé de changer le nom de la method static chargement, de mettre un nom différent de ta class

      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        29 mai 2017 à 1:34:42

        Salut, +1 Romuald44

        quand tu instancie une classe cela appelle la fonction __contruct de la classe qui ne doit pas être static et qui doit être public

        public function __contruct(){

        }

        Si cette fonction n'est pas présente il appelle le constructeur de la classe parente.
        Si ellle n'a pas de classe parente alors il appelle la fonction  qui porte le même nom que la classe, et tu en a une qui porte le meme nom mais qui est static.

        c'est une classe qui n'a que des fonction static tu n'as donc pas besoin de l'instancier.

        Il te suffit d'appeller directement la fonction par 

        Chargement::chargement("nom de la classe à charger");

        source : http://php.net/manual/fr/language.oop5.decon.php

        Voilà si ça peut t'aider.

        A+

        -
        Edité par Anonyme 29 mai 2017 à 1:35:26

        • Partager sur Facebook
        • Partager sur Twitter
          29 mai 2017 à 9:57:23

          Je vais juste faire une petite correction sur le constructeur qui DOIT être publique car non ce n'est pas obligatoire sinon on pourrait pas faire de singleton :)

          Deuxièmement le constructeur d'une classe ne peut plus être défini en mettant le même nom que la classe depuis PHP 7 :
          http://php.net/manual/fr/migration70.deprecated.php

          Sinon le reste est bon

          • Partager sur Facebook
          • Partager sur Twitter
            29 mai 2017 à 10:06:58

            quenti77 a écrit:

            Je vais juste faire une petite correction sur le constructeur qui DOIT être publique car non ce n'est pas obligatoire sinon on pourrait pas faire de singleton :)

            Ni de prototype. :) (un design pattern similaire mais à mon sens plus utile :p )

            Parlant de ça, un jour peut-être on aura droit aux constructeurs statiques... :(

            • Partager sur Facebook
            • Partager sur Twitter
              30 mai 2017 à 7:17:26

              Bonjour tout le monde,

              Je vous remercie pour vos conseils. Pour ma part, c'est important de se sentir soutenue dans son emploi (surtout en programmation). Cependant, je ne peux pas aller toujours déranger les développeurs. Le Développeur Senior n'est pas souvent là.

              D'une part, il préfère garder un emploi dans une grande entreprise. Les raisons sont qu'il ne veut pas coûter trop à son entreprise familiale, s'ils ont besoin d'argent, ils peuvent compter sur une rentrée assez confortable et aussi pour la formation interne (chère) pour rester à jour et performant.

              Le développeur Junior est patient. Néanmoins, il travaille sur des projets plus complexes, ... Les rentrées de l'entreprise sont assez dépendantes de son travail. Le patron s'occupe de la gestion de l'équipe, de l'entreprise, du commercial (rencontre avec les clients), ...

              La dernière personne qui s'y connaît en programmation est le patriarche. Il n'est pas non plus toujours disponible (problèmes de santé). En outre, il gère aussi des tâches. Par contre, c'est une encyclopédie vivante. Toutes les autres personnes n'y connaissent rien en programmation. Ils leur manquent un Web Designer.

              C'est sûrement la raison de ma présence. À long terme, je devrais me former là-dedans. D'ailleurs, j'aimerais avoir des informations concrètes là-dessus.

              Y a-t-il des tutoriels sur cette fonction?

              Quels sont ceux les premiers à lire?

              • Partager sur Facebook
              • Partager sur Twitter
                30 mai 2017 à 10:28:33

                Le web design, c'est le design des écrans, ça, si je ne m'abuse. En d'autres termes, le frontend. Et comme tout ce qui est design, savoir manier le pinceau ne fait pas de toi un artiste peintre. ;)

                Aptès rien n'empêche d'aller de l'avant avec les bases, c'est même très encouragé. Mais pour arriver à un plus haut niveau, il faudra sans doute une formation dans ce sens, je pense. Après ce n'est que mon avis, et je suis un backend. Peut-être que l'avis de quelqu'un qui est plutôt frontend, justement, serait plus pertinent.

                • Partager sur Facebook
                • Partager sur Twitter
                  30 mai 2017 à 15:22:34

                  Bonjour Darth Killer,

                  Nous en avons parlé. L'école où j'ai fait mes études supérieures veut justement créer une nouvelle formation dans ce sens. Le Web prend de plus en plus de place. Aujourd'hui, d'un côté nous avons les developpers (POO MVC, Symfony, Ajax, ...). De l'autre, on a les designers (création graphique (infographie), transformation en HTML/CSS Responsive, côté interactif (effets jQuery et autres).

                  J'ai une amie qui avait suivi les deux pour le vocabulaire, pour mieux communiquer, ... Finalement, elle était plus designer. Personnellement, je ne sais pas me situer. Les deux ont leurs avantages et leurs inconvénients. Je touche un peu à tout. Malheureusement, on ne peut pas tout maîtriser.

                  Est-ce que vous auriez d'autres avis?

                  • Partager sur Facebook
                  • Partager sur Twitter
                    30 mai 2017 à 15:46:53

                    On peut arriver à faire les 2, caractéristique de l'informatique par rapport à d'autres domaines de la "Cconnaissance". Maintenant, qu'est-ce qui te plait davantage et te parle davantage, c'est une autre histoire. ;)

                    Perso c'est comme ça que j'ai fini en backend, alors que j'ai commencé par de l'HTML et du CSS (sans compté le Basic, super vieux et pas repratiqué depuis). ;)

                    • Partager sur Facebook
                    • Partager sur Twitter
                      30 mai 2017 à 16:09:16

                      ^^ arrête Darth, j'ai l'impression de lire ma bio :p

                      ++

                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 juin 2017 à 18:13:42

                        Bonsoir Darth Killer,

                        Je te remercie pour ta réponse. L'avantage du backend est de toujours pouvoir garder le même graphisme. Un peu comme si c'était un logiciel normal. Le frontend sera à chaque fois différent. Cependant, je ne sais pas au niveau algorithmique lequel est le plus compliqué. Normalement, le Web Designer ne s'occupe pas de cette partie ni en backend ni en frontend. La maîtrise d'un vieux langage permet de trouver plus vite la solution d'un point de vue de la logique.

                        Bonsoir christouphe,

                        Je te remercie pour ton commentaire. L'expérience reste primordiale en programmation.

                        BONNE SOIRÉE

                        • Partager sur Facebook
                        • Partager sur Twitter
                          4 juin 2017 à 18:24:19

                          Ce que tu dis là n'est vrai que sur un projet où tu arrives à détacher complètement la couche interface des autres couches. Sur un projet web, c'est faisable en concevant la totalité de ton site sous la forme d'un service web (de type API REST par exemple), et de proposer une interface en HTML, CSS et JS qui fait des appel à ce service web pour interagir avec et mettre à jour les écrans. L'intérêt majeur ici est que tu peux garder le même backend et changer juste l'interface pour déployer simultanément en site web, en application mobile pour tablettes et téléphones, et autres supports... Mais c'est quelque chose qui se prévoit et conçoit dès le début, bien avant de coder. Un MVC en structure classique par exemple ne permet pas ça, car c'est le back qui traite et affiche chaque page, du coup interface et backend s'en retrouvent intimement liés.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Premier mini-projet réel en POO MVC

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown