Skip to content

6. Esercizio pratico - IMPOTS con oggetti (impots_03)

Riprendiamo l’esercizio già studiato in precedenza (paragrafi 4.2 e 4.3) per risolverlo con un codice PHP che utilizza una classe.


<?php

// definizione di una classe "Impostazioni"
class Impôts {

  // attributi: i 3 array di dati
  private $limites;
  private $coeffR;
  private $coeffN;
  
  // costruttore

  public function __construct($IMPOTS) {
    // $IMPOTS: il nome del file contenente i dati delle tabelle $limites, $coeffR, $coeffN
    // Il file $IMPOTS esiste?
    if (!file_exists($IMPOTS)) {
      throw new Exception("Le fichier $IMPOTS n'existe pas");
    }//if
    // lettura in blocco del file
    $tables = file($IMPOTS);
    if (!$tables) {
      throw new Exception("Erreur lors de l'exploitation du fichier $IMPOTS");
    }//if
    // creazione delle 3 tabelle - si presume che le righe siano sintatticamente corrette
    $u = new Utilitaires(); // per disporre di funzioni di utilità
    $this->limites = explode(":", $u->cutNewLineChar($tables[0]));
    $this->coeffR = explode(":", $u->cutNewLineChar($tables[1]));
    $this->coeffN = explode(":", $u->cutNewLineChar($tables[2]));
    }

  // --------------------------------------------------------------------------
  public function calculer($marié, $enfants, $salaire) {
    // $marié: sì, no
    // $enfants: numero di figli
    // $salaire: stipendio annuo
    
    // numero di quote
    $marié = strtolower($marié);
    if ($marié == "oui")
      $nbParts = $enfants / 2 + 2;
    else
      $nbParts=$enfants / 2 + 1;
    // una quota e mezza in più se ci sono almeno 3 figli
    if ($enfants >= 3)
      $nbParts+=0.5;
    // reddito imponibile
    $revenuImposable = 0.72 * $salaire;
    // quoziente familiare
    $quotient = $revenuImposable / $nbParts;
    // viene inserito alla fine della tabella dei limiti per interrompere il ciclo successivo
    $this->limites[count($this->limites) - 1] = $quotient;
    // calcolo dell'imposta
    $i = 0;
    while ($quotient > $this->limites[$i])
      $i++;
    // poiché $quotient è stato inserito alla fine della tabella $limites, il ciclo precedente
    // non può andare oltre i limiti della tabella $limites
    // ora è possibile calcolare l’imposta
    return floor($revenuImposable * $this->coeffR[$i] - $nbParts * $this->coeffN[$i]);
  }

}

// una classe di funzioni di utilità
class Utilitaires {

  public function cutNewLinechar($ligne) {
    // si rimuove il carattere di fine riga da $ligne se presente
    $L = strlen($ligne);  // lunghezza riga
    while (substr($ligne, $L - 1, 1) == "\n" or substr($ligne, $L - 1, 1) == "\r") {
      $ligne = substr($ligne, 0, $L - 1);
      $L--;
    }//while
    // fine
    return($ligne);
  }

}

// test -----------------------------------------------------
// definizione delle costanti
$DATA = "data.txt";
$RESULTATS = "resultats.txt";
$IMPOTS = "impots.txt";
// i dati necessari per il calcolo dell'imposta sono stati inseriti nel file IMPOTS
// con una riga per ogni tabella nella forma
// "val1":"val2":"val3",...
// si crea un oggetto «Impostazioni»
try {
  $I = new Impôts($IMPOTS);
} catch (Exception $e) {
  print $e->getMessage();
  exit;
}
// si crea un oggetto utilità
$u = new Utilitaires();

// lettura dei dati utente
$data = fopen($DATA, "r");
if (!$data) {
  print "Impossible d'ouvrir en lecture le fichier des données [$DATA]\n";
  exit;
}

// apertura del file dei risultati
$résultats = fopen($RESULTATS, "w");
if (!$résultats) {
  print "Impossible de créer le fichier des résultats [$RESULTATS]\n";
  exit;
}

// si elabora la riga corrente del file dei dati
while ($ligne = fgets($data, 100)) {
  // si rimuove l'eventuale carattere di fine riga
  $ligne = $u->cutNewLineChar($ligne);
  // si recuperano i 3 campi "coniuge", "figli" e "stipendio" che formano $ligne
  list($marié, $enfants, $salaire) = explode(",", $ligne);
  // si calcola l’imposta
  $impôt = $I->calculer($marié, $enfants, $salaire);
  // si inserisce il risultato
  fputs($résultats, "$marié:$enfants:$salaire:$impôt\n");
  // dato successivo
}// while
// si chiudono i file
fclose($data);
fclose($résultats);

// fine
print "Terminé\n";
exit;
?>

Il file [impots.txt]:

12620:13190:15640:24740:31810:39970:48360:55790:92970:127860:151250:172040:195000:0
0:0.05:0.1:0.15:0.2:0.25:0.3:0.35:0.4:0.45:0.5:0.55:0.6:0.65
0:631:1290.5:2072.5:3309.5:4900:6898.5:9316.5:12106:16754.5:23147.5:30710:39312:49062

Il file [data.txt]

oui,2,200000
non,2,200000
oui,3,200000
non,3,200000
oui,5,50000
non,0,3000000

Risultati: quelli già ottenuti nelle versioni con tabelle e file.

Il file [resultats.txt]

oui:2:200000:22504
non:2:200000:33388
oui:3:200000:16400
non:3:200000:22504
oui:5:50000:0
non:0:3000000:1354938

Commenti

  • riga 4: la classe Impôts. Incapsula dati e metodi che consentono il calcolo dell'imposta:
  • dati: righe 7-9 – si tratta dei tre array di dati che consentono il calcolo dell'imposta. Questi tre array vengono inizializzati dal costruttore della riga 13 a partire da un file di testo.
  • metodi: riga 32 – il metodo calculer consente di calcolare l'imposta.
  • righe 17, 22: quando il costruttore non riesce a creare l’oggetto Impôts, genera un’eccezione.
  • riga 25: la classe Utilitaires è stata definita per incapsulare la funzione cutNewLineChar.
  • righe 26-28: inizializzazione dei tre campi privati della classe Impôts
  • riga 32: il metodo calculer della classe Impôts consente di calcolare l'imposta di un contribuente.
  • righe 65-78: la classe Utilitaires
  • righe 89-94: creazione di un oggetto Impôts con gestione di eventuali eccezioni. Questa operazione utilizzerà il file di testo $IMPOTS per inserire il suo contenuto nei tre campi privati dell'oggetto Impôts.
  • riga 96: creazione di un oggetto Utilitaires per poter utilizzare la funzione cutNewLineChar.