Skip to content

6. Toepassingsopdracht - IMPOTS met objecten (impots_03)

We nemen de eerder behandelde oefening (paragrafen 4.2 en 4.3) opnieuw ter hand om deze op te lossen met een code PHP waarbij gebruik wordt gemaakt van een klasse.


<?php

// definitie van een klasse Impôts
class Impôts {

  // attributen: de 3 gegevensarrays
  private $limites;
  private $coeffR;
  private $coeffN;
  
  // constructor

  public function __construct($IMPOTS) {
    // $IMPOTS: de naam van het bestand dat de gegevens uit de tabellen $limites, $coeffR en $coeffN bevat
    // bestaat het bestand $IMPOTS?
    if (!file_exists($IMPOTS)) {
      throw new Exception("Le fichier $IMPOTS n'existe pas");
    }//if
    // het bestand in blokken lezen
    $tables = file($IMPOTS);
    if (!$tables) {
      throw new Exception("Erreur lors de l'exploitation du fichier $IMPOTS");
    }//if
    // aanmaken van de 3 tabellen – er wordt aangenomen dat de regels syntactisch correct zijn
    $u = new Utilitaires(); // om over hulpprogramma's te beschikken
    $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é: ja, nee
    // $enfants: aantal kinderen
    // $salaire: jaarsalaris
    
    // aantal aandelen
    $marié = strtolower($marié);
    if ($marié == "oui")
      $nbParts = $enfants / 2 + 2;
    else
      $nbParts=$enfants / 2 + 1;
    // een half aandeel extra bij ten minste 3 kinderen
    if ($enfants >= 3)
      $nbParts+=0.5;
    // belastbaar inkomen
    $revenuImposable = 0.72 * $salaire;
    // gezinsquotiënt
    $quotient = $revenuImposable / $nbParts;
    // wordt aan het einde van de tabel met limieten geplaatst om de daaropvolgende lus te beëindigen
    $this->limites[count($this->limites) - 1] = $quotient;
    // berekening van de belasting
    $i = 0;
    while ($quotient > $this->limites[$i])
      $i++;
    // omdat $quotient aan het einde van de tabel $limites is geplaatst, de voorgaande lus
    // mag niet buiten de tabel $limites vallen
    // nu kunnen we de belasting berekenen
    return floor($revenuImposable * $this->coeffR[$i] - $nbParts * $this->coeffN[$i]);
  }

}

// een klasse met hulpprogramma's
class Utilitaires {

  public function cutNewLinechar($ligne) {
    // we verwijderen het einde-van-regel-teken uit $ligne als dat aanwezig is
    $L = strlen($ligne);  // regellengte
    while (substr($ligne, $L - 1, 1) == "\n" or substr($ligne, $L - 1, 1) == "\r") {
      $ligne = substr($ligne, 0, $L - 1);
      $L--;
    }//while
    // einde
    return($ligne);
  }

}

// test -----------------------------------------------------
// definitie van de constanten
$DATA = "data.txt";
$RESULTATS = "resultats.txt";
$IMPOTS = "impots.txt";
// de gegevens die nodig zijn voor de berekening van de belasting zijn in het bestand IMPOTS geplaatst
// met één regel per tabel in de vorm
// "val1":"val2":"val3",...
// er wordt een object ‘Belastingen’ aangemaakt
try {
  $I = new Impôts($IMPOTS);
} catch (Exception $e) {
  print $e->getMessage();
  exit;
}
// we maken een hulpprogramma-object aan
$u = new Utilitaires();

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

// het resultatenbestand wordt geopend
$résultats = fopen($RESULTATS, "w");
if (!$résultats) {
  print "Impossible de créer le fichier des résultats [$RESULTATS]\n";
  exit;
}

// de huidige regel van het gegevensbestand wordt verwerkt
while ($ligne = fgets($data, 100)) {
  // eventueel einde-van-regel-teken verwijderen
  $ligne = $u->cutNewLineChar($ligne);
  // de 3 velden 'gehuwd', 'kinderen' en 'salaris' worden opgehaald, die samen $ligne vormen
  list($marié, $enfants, $salaire) = explode(",", $ligne);
  // de belasting wordt berekend
  $impôt = $I->calculer($marié, $enfants, $salaire);
  // het resultaat wordt ingevuld
  fputs($résultats, "$marié:$enfants:$salaire:$impôt\n");
  // volgende gegevens
}// while
// de bestanden sluiten
fclose($data);
fclose($résultats);

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

Het bestand [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

Het bestand [data.txt]

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

Resultaten: dezelfde als die al zijn verkregen in de versies met tabellen en bestanden.

Het bestand [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

Opmerkingen

  • regel 4: de klasse Impôts. Deze bevat gegevens en methoden waarmee de belasting kan worden berekend:
  • gegevens: regels 7-9 – dit zijn de drie gegevensarrays die nodig zijn voor de berekening van de belasting. Deze drie arrays worden door de constructor op regel 13 geïnitialiseerd op basis van een tekstbestand.
  • methoden: regel 32 – de methode calculer maakt het mogelijk de belasting te berekenen.
  • regels 17, 22: wanneer de constructor het object Impôts niet kan aanmaken, genereert hij een uitzondering.
  • regel 25: de klasse Utilitaires is gedefinieerd om de functie cutNewLineChar in te kapselen.
  • regels 26-28: initialisatie van de drie privévelden van de klasse Impôts
  • regel 32: met de methode calculer van de klasse Impôts kan de belasting van een belastingplichtige worden berekend.
  • regels 65-78: de klasse Utilitaires
  • regels 89-94: aanmaken van een object Impôts met afhandeling van eventuele uitzonderingen. Bij het aanmaken wordt het tekstbestand $IMPOTS gebruikt om de inhoud ervan in de drie privévelden van het object Impôts te plaatsen.
  • regel 96: aanmaken van een object Utilitaires om de functie cutNewLineChar te kunnen gebruiken.