Architecture(s) et
application(s) Web

CSC4101 - cours PHP

01/09/2024

Plan du cours

  • CM 1-2
    • Introduction du module
    • Langage PHP
    • Accès aux données avec l’ORM Doctrine
    • Concepts généraux du Web, architecture 3 couches
    • Histoire succincte de la Toile

Plan de la séquence

  1. Technologie PHP

Survol rapide

  • Pas un cours pour enseigner le langage : apprentissage en autonomie
  • Quelques éléments pour planter le décor

Faire tourner des programmes sur le serveur Web

  • Besoin : Programmer des applications (couche traitements, qui s’exécute côté serveur)
  • Choix d’un langage ?
  • Choix d’une technologie associée ?

Langage choisi : PHP

  • Langage nouveau (pour vous)
  • « Proche » de Java (ou C)
  • Interprété (comme Bash ou Python)

Mais aussi des outils…

Mais pourquoi tant de haine ?

5Xjj4bC.jpg

Cf. « Why developers hate PHP » par Mehdi Zedi

  • Vous aimez apprendre des choses à la mode ?

    vous allez voir des choses modernes, si si (objet)

  • PHP est un vieux langage à la mauvaise réputation
  • Vous allez devoir bosser (de plus en plus) sur des vieux trucs : importance de la maintenance vs innovation (ou innovation dans la maintenance) : ODD ?

  • Les outils qu’on vous présente (Symfony) sont à l’état de l’art (objet, génie logiciel)
  • Pédagogie : complexité maîtrisée (application des concepts en 2A, chaque chose en son temps)
  • Symfony : PHP moderne

    PHP « comme il faut »

    S’appuyer sur un cadriciel (framework) moderne comme Symfony

    • orienté objet
    • fonctionnel
    • injection de dépendances, conteneurs
    • templates
    • PHPDoc
    • tests

    http://www.phptherightway.com/

    symfony_black_02.png

    • Framework de référence
    • Assemblage de beaucoup de bibliothèques
    • Modèle de composants objet évolué
    • Documentation
    • Communauté
    • Environnement de mise au point

    https://symfony.com/

    Une licorne française

    https://sensiolabs.com/

    sensiolabs.png

    « SensioLabs, une des plus belles réussites françaises du web » –

    gouvernement-fr.png

    In #HistoiresdeFrance, chapitre 21 (post X du Gouvernement Français, décembre 2016 - cf. sauvegarde sur/ Internet Archive)

    Autres frameworks :

    PHP
    Laravel, CodeIgniter, CakePHP, Zend, …
    Ruby
    Ruby on Rails, Sinatra, …
    Node.js
    Meteor, Express.js, …
    Python
    Django, Flask, …
    Java
    Spring, Struts,

    Langage PHP

    Langage

    php-med-trans.png

    Webysther_20160423_-_Elephpant.svg.png

    • Syntaxe style C / Java
    • Objets
    • Interprété
    • Héritage contexte Web, CGI (« PHP: Hypertext Preprocessor »)
    • Depuis 1994 (PHP 8 depuis fin 2020)
    • Versions pour ce cours : >= 8.2

    Hello world

    <html>
      <head>
        <title>Test PHP</title>
      </head>
      <body>
        <?php echo '<p>Bonjour le monde</p>'; ?>
      </body>
    </html>
    
    

    ou bien :

    <?php
    
      $html = "<html><head><title>Test PHP</title></head><body>";
      $html .= "<p>Bonjour le monde</p>";
      $html .= "</body></html>";
      print($html);
    
    

    Syntaxe

    Vous allez commencer à l’apprendre en hors-présentiel, cette semaine

    Vous devriez comprendre ce que je vais montrer

    Syntaxe objet

    Appel de méthode

    $io = new SymfonyStyle($input, $output);
    
    $io->title('list of todos:');
    

    Constructeur, propriétés internes

    class MyCommand
    {
            private $todoRepository;
    
            public function __construct($repository)
            {
                    $this->todoRepository = $repository;
            }
    
            protected function execute()
            {
                    $todos = $this->todoRepository->findAll();
            }
    

    Valeur de retour

    protected function execute(SymfonyStyle $io): int
    {
            $todos = $this->todoRepository->findAll();
    
            if( empty($todos) ) {
                    return Command::FAILURE;
            }
            else {
                    $io->title('list of todos:');
                    $io->listing($todos);
            }
    
            return Command::SUCCESS;
    }
    

    Surcharge / héritage

    use Symfony\Component\Console\Command\Command;
    
    class ListTodosCommand extends Command
    {
            public function __construct($repository)
            {
                    $this->todoRepository = $repository;
    
                    parent::__construct();
            }
    

    Espace de noms

    namespace App\Command;
    
    use Symfony\Component\Console\Command\Command;
    use App\Entity\Todo;
    use Symfony\Component\Console\Input\InputOption;
    use Symfony\Component\Console\Output\OutputInterface;
    
    class MyCommand extends Command
    {
            // ...
            public function __construct(ManagerRegistry $manager)
            {
                    $this->todoRepository = $manager->getRepository(Todo::class);
    
                    parent::__construct();
            }
    
            protected function execute(InputInterface $input, OutputInterface $output): int
            {
                    // ...
                    return Command::SUCCESS;
            }
    

    Docblocks PHPDoc

    • Commentaires améliorés
    • méta-informations
    /**
     * Classe "Circuit" du Modèle
     */
    class Circuit
    {
    ...
        /**
         * Set description
         *
         * @param string $description
         *
         * @return Circuit
         */
        public function setDescription($description)
        {
            ...
    

    Attributs (> PHP 8.x)

    use Symfony\Component\Console\Attribute\AsCommand;
    use Symfony\Component\Console\Command\Command;
    
    #[AsCommand(
        name: 'app:list-todos',
        description: 'List tasks',
    )]
    class ListTodosCommand extends Command
    {
    

    Installation des outils et bibliothèques

    Nous installerons/utiliserons la variante CLI (Command Line Interface)

    • Interpréteur ligne de commande (php-cli)

      $ php helloworld.php
      
    • Interpréteur invoqué par le serveur HTTP (php)
    • Bibliothèques :
      • php-sqlite3
      • php-intl
      • php-xml

    Bibliothèques complémentaires

    Logiciels faisant partie de l’écosystème de bibliothèques, composants, frameworks PHP.

    Sources :

    • Composer : utiliser des bibliothèques libres
    • PEAR (PHP Extension and Application Repository)

    Composer

    Gestionnaire de paquetages PHP.

    logo-composer-transparent2.png

    https://getcomposer.org/

    Il fournit :

    • gestionnaire de dépendances entre bibliothèques (et entre versions),
    • téléchargement des paquetages des bibliothèques depuis packagist
    • autoloader qui facilite les déclarations et les chargements associés au démarrage des programmes,

    Descripteur composer.json

    Exemple de description d’un projet local :

    {
        "type": "project",
        "require": {
            "php": ">=8.1",
            "symfony/console": "^6.4",
            "symfony/flex": "^1.0",
            "symfony/framework-bundle": "^6.4"
        },
        "require-dev": {
            "symfony/dotenv": "^6.4"
        },
        "config": {
            "preferred-install": {
                "*": "dist"
            },
            "sort-packages": true
        },
        "autoload": {
            "psr-4": {
                "App\\": "src/"
            }
        }
    }
    

    Installation des bibliothèques

    1. Le développeur lance :

      $ composer install
      
    2. Analyse des règles contenues dans composer.json
    3. Résultat est téléchargé dans vendor/

      autoload.php
      autoload_runtime.php
      bin/
      composer/
      doctrine/
      easycorp/
      friendsofphp/
      laminas/
      masterminds/
      monolog/
      nikic/
      psr/
      symfony/
      twig/
      

    Mettre au point et tester le code

    • Langage interprété
    • Trouver les bugs avant exécution ?
    • Tester (systématiquement)
    • IDE (Integrated Development Environment), pour détecter les erreurs quand on tape le code

    Mise au point : affichage

    Afficher des traces d’exécution

    • print() est votre ami ?
    • mais on peut faire mieux !

    dump() dans Symfony

    Utiliser dump()

    dump($myarray);
    

    dump-simple.png

    Tests PHPUnit

    • environnement de tests : PHPUnit
    • systématiser les tests :
      • conformité
      • non-régression
    • Tester avant de déployer en production

    Ne sera pas utilisé dans le cours (faute de temps)

    </PHP>

    Take away

    • PHP moderne
    • Syntaxe objet
    • Outils du développeur : Composer, dump()

    Postface

    Crédits illustrations et vidéos

    Copyright

    • Document propriété de ses auteurs et de Télécom SudParis (sauf exceptions explicitement mentionnées).
    • Réservé à l’utilisation pour la formation initiale à Télécom SudParis.