6. Ćwiczenie praktyczne – IMPOTS z obiektami (impots_03)
Wracamy do ćwiczenia omówionego wcześniej (punkty 4.2 i 4.3), aby rozwiązać je za pomocą kodu PHP wykorzystującego klasę.
<?php
// definicja klasy Podatki
class Impôts {
// atrybuty: 3 tablice danych
private $limites;
private $coeffR;
private $coeffN;
// konstruktor
public function __construct($IMPOTS) {
// $IMPOTS: nazwa pliku zawierającego dane z tabel $limites, $coeffR, $coeffN
// czy plik $IMPOTS istnieje?
if (!file_exists($IMPOTS)) {
throw new Exception("Le fichier $IMPOTS n'existe pas");
}//if
// odczyt pliku w blokach
$tables = file($IMPOTS);
if (!$tables) {
throw new Exception("Erreur lors de l'exploitation du fichier $IMPOTS");
}//if
// utworzenie 3 tabel – zakłada się, że wiersze są poprawne pod względem składniowym
$u = new Utilitaires(); // w celu uzyskania funkcji pomocniczych
$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é: tak, nie
// $enfants: liczba dzieci
// $salaire: roczne wynagrodzenie
// liczba udziałów
$marié = strtolower($marié);
if ($marié == "oui")
$nbParts = $enfants / 2 + 2;
else
$nbParts=$enfants / 2 + 1;
// o 1/2 udziału więcej, jeśli jest co najmniej troje dzieci
if ($enfants >= 3)
$nbParts+=0.5;
// dochód podlegający opodatkowaniu
$revenuImposable = 0.72 * $salaire;
// współczynnik rodzinny
$quotient = $revenuImposable / $nbParts;
// umieszczony na końcu tabeli limitów w celu zakończenia następującej pętli
$this->limites[count($this->limites) - 1] = $quotient;
// obliczenie podatku
$i = 0;
while ($quotient > $this->limites[$i])
$i++;
// ponieważ umieszczono $quotient na końcu tabeli $limites, poprzednia pętla
// nie może wykraczać poza tablicę $limites
// teraz można obliczyć podatek
return floor($revenuImposable * $this->coeffR[$i] - $nbParts * $this->coeffN[$i]);
}
}
// klasa funkcji pomocniczych
class Utilitaires {
public function cutNewLinechar($ligne) {
// usuwamy znacznik końca linii z $ligne, jeśli istnieje
$L = strlen($ligne); // długość wiersza
while (substr($ligne, $L - 1, 1) == "\n" or substr($ligne, $L - 1, 1) == "\r") {
$ligne = substr($ligne, 0, $L - 1);
$L--;
}//while
// koniec
return($ligne);
}
}
// test -----------------------------------------------------
// definicja stałych
$DATA = "data.txt";
$RESULTATS = "resultats.txt";
$IMPOTS = "impots.txt";
// dane niezbędne do obliczenia podatku zostały umieszczone w pliku IMPOTS
// w postaci jednego wiersza na tabelę w formacie
// „val1”:„val2”:„val3”,...
// tworzy się obiekt „Podatki”
try {
$I = new Impôts($IMPOTS);
} catch (Exception $e) {
print $e->getMessage();
exit;
}
// tworzymy obiekt narzędziowy
$u = new Utilitaires();
// odczyt danych użytkownika
$data = fopen($DATA, "r");
if (!$data) {
print "Impossible d'ouvrir en lecture le fichier des données [$DATA]\n";
exit;
}
// otwieranie pliku wyników
$résultats = fopen($RESULTATS, "w");
if (!$résultats) {
print "Impossible de créer le fichier des résultats [$RESULTATS]\n";
exit;
}
// przetwarzanie bieżącego wiersza pliku danych
while ($ligne = fgets($data, 100)) {
// usuwamy ewentualny znak końca linii
$ligne = $u->cutNewLineChar($ligne);
// pobieranie trzech pól: „married”, „children” i „salary”, które tworzą $ligne
list($marié, $enfants, $salaire) = explode(",", $ligne);
// oblicza się podatek
$impôt = $I->calculer($marié, $enfants, $salaire);
// wpisuje się wynik
fputs($résultats, "$marié:$enfants:$salaire:$impôt\n");
// kolejny rekord
}// while
// zamykamy pliki
fclose($data);
fclose($résultats);
// koniec
print "Terminé\n";
exit;
?>
Plik [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
Plik [data.txt]
Wyniki: te same, co w wersjach z tabelami i plikami.
Plik [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
Komentarze
- wiersz 4: klasa Impôts. Zawiera ona dane i metody umożliwiające obliczenie podatku:
- dane: wiersze 7–9 – są to trzy tablice danych umożliwiające obliczenie podatku. Te trzy tablice są inicjowane przez konstruktor w wierszu 13 na podstawie pliku tekstowego.
- metody: wiersz 32 – metoda calculer umożliwia obliczenie podatku.
- wiersze 17, 22: gdy konstruktor nie może utworzyć obiektu Impôts, zgłasza wyjątek.
- wiersz 25: klasa Utilitaires została zdefiniowana w celu enkapsulacji funkcji cutNewLineChar.
- wiersze 26–28: inicjalizacja trzech pól prywatnych klasy Impôts
- wiersz 32: metoda calculer klasy Impôts służy do obliczania podatku podatnika.
- wiersze 65–78: klasa Utilitaires
- wiersze 89–94: utworzenie obiektu Impôts wraz z obsługą ewentualnego wyjątku. Operacja ta wykorzystuje plik tekstowy $IMPOTS w celu umieszczenia jego zawartości w trzech polach prywatnych obiektu Impôts.
- wiersz 96: utworzenie obiektu Utilitaires w celu uzyskania dostępu do funkcji cutNewLineChar.