<?php
    abstract class forme
    {
        abstract function surface();
        abstract function perimetre();
    }

    class cercle extends forme 
    {
        private $rayon;

        function __construct($rayon)
        {
            $this->rayon = $rayon;
        }
    
        function surface() 
        {
            return M_PI * $this->rayon * $this->rayon;
        }

        function perimetre()
        {
            return M_PI * $this->rayon * 2;
        }
    }

    class rectangle extends forme 
    {
        protected $longeur;
        protected $largeur;

        function __construct($longeur, $largeur)
        {
            $this->longeur = $longeur;
            $this->largeur = $largeur;
        }
    
        function surface() 
        {
            return $this->longeur * $this->largeur;
        }

        function perimetre()
        {
            return 2 * $this->longeur + 2 * $this->largeur;
        }
    }

    class carre extends rectangle 
    {
        function __construct($cote)
        {
            $this->longeur = $cote;
            $this->largeur = $cote;
        }
    }

    $cercle = new cercle(3);
    echo "Un cercle de rayon 3 a un périmètre de ";
    echo $cercle->perimetre();
    echo " et une surface de ";
    echo $cercle->surface();
    
    $rectangle = new rectangle(4,3);
    echo ". Un rectangle de 4 par 3 a un périmètre de ";
    echo $rectangle->perimetre();
    echo " et une surface de ";
    echo $rectangle->surface();
    
    $carre = new carre(4);
    echo ". Un carré de côté 4 a un périmètre de ";
    echo $carre->perimetre();
    echo " et une surface de ";
    echo $carre->surface();