6. Практичне завдання — IMPOTS з об’єктами (impots_03)
Повернемося до вправи, яку ми вже розглядали раніше (розділи 4.2 та 4.3), щоб вирішити її за допомогою коду PHP, що використовує клас.
<?php
// визначення класу «Податки»
class Impôts {
// атрибути: 3 масиви даних
private $limites;
private $coeffR;
private $coeffN;
// конструктор
public function __construct($IMPOTS) {
// $IMPOTS: ім'я файлу, що містить дані з таблиць $limites, $coeffR, $coeffN
// чи існує файл $IMPOTS?
if (!file_exists($IMPOTS)) {
throw new Exception("Le fichier $IMPOTS n'existe pas");
}//if
// блокове читання файлу
$tables = file($IMPOTS);
if (!$tables) {
throw new Exception("Erreur lors de l'exploitation du fichier $IMPOTS");
}//if
// створення 3 таблиць — припускаємо, що рядки синтаксично правильні
$u = new Utilitaires(); // для використання допоміжних функцій
$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é: так, ні
// $enfants: кількість дітей
// $salaire: річний оклад
// кількість часток
$marié = strtolower($marié);
if ($marié == "oui")
$nbParts = $enfants / 2 + 2;
else
$nbParts=$enfants / 2 + 1;
// на 1/2 частки більше, якщо є щонайменше 3 дітей
if ($enfants >= 3)
$nbParts+=0.5;
// оподатковуваний дохід
$revenuImposable = 0.72 * $salaire;
// сімейний коефіцієнт
$quotient = $revenuImposable / $nbParts;
// вказується в кінці таблиці обмежень для припинення наступного циклу
$this->limites[count($this->limites) - 1] = $quotient;
// розрахунок податку
$i = 0;
while ($quotient > $this->limites[$i])
$i++;
// оскільки $quotient розміщено в кінці таблиці $limites, попередній цикл
// не може виходити за межі масиву $limites
// тепер можна обчислити податок
return floor($revenuImposable * $this->coeffR[$i] - $nbParts * $this->coeffN[$i]);
}
}
// клас допоміжних функцій
class Utilitaires {
public function cutNewLinechar($ligne) {
// видаляємо маркер кінця рядка з $ligne, якщо він існує
$L = strlen($ligne); // довжина рядка
while (substr($ligne, $L - 1, 1) == "\n" or substr($ligne, $L - 1, 1) == "\r") {
$ligne = substr($ligne, 0, $L - 1);
$L--;
}//while
// кінець
return($ligne);
}
}
// тест -----------------------------------------------------
// визначення констант
$DATA = "data.txt";
$RESULTATS = "resultats.txt";
$IMPOTS = "impots.txt";
// дані, необхідні для розрахунку податку, були розміщені у файлі IMPOTS
// по одному рядку на таблицю у вигляді
// "val1":"val2":"val3",...
// створюється об’єкт «Податки»
try {
$I = new Impôts($IMPOTS);
} catch (Exception $e) {
print $e->getMessage();
exit;
}
// створюється об’єкт utilitaires
$u = new Utilitaires();
// читання даних користувача
$data = fopen($DATA, "r");
if (!$data) {
print "Impossible d'ouvrir en lecture le fichier des données [$DATA]\n";
exit;
}
// відкриття файлу результатів
$résultats = fopen($RESULTATS, "w");
if (!$résultats) {
print "Impossible de créer le fichier des résultats [$RESULTATS]\n";
exit;
}
// обробка поточного рядка файлу даних
while ($ligne = fgets($data, 100)) {
// видаляємо можливий символ кінця рядка
$ligne = $u->cutNewLineChar($ligne);
// витягуються 3 поля «одружений», «діти», «зарплата», що утворюють $ligne
list($marié, $enfants, $salaire) = explode(",", $ligne);
// розраховується податок
$impôt = $I->calculer($marié, $enfants, $salaire);
// записуємо результат
fputs($résultats, "$marié:$enfants:$salaire:$impôt\n");
// наступні дані
}// поки
// закриваємо файли
fclose($data);
fclose($résultats);
// кінець
print "Terminé\n";
exit;
?>
Файл [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
Файл [data.txt]
Результати: ті, що вже були отримані у версіях з таблицями та файлами.
Файл [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
Коментарі
- рядок 4: клас Impôts. Він інкапсулює дані та методи, що дозволяють обчислити податок:
- дані: рядки 7–9 — це три масиви даних, що дозволяють обчислити податок. Ці три масиви ініціалізуються конструктором у рядку 13 на основі текстового файлу.
- методи: рядок 32 — метод calculer дозволяє обчислити податок.
- рядки 17, 22: коли конструктор не може створити об’єкт Impôts, він генерує виняток.
- рядок 25: клас Utilitaires було визначено для інкапсуляції функції cutNewLineChar.
- рядки 26–28: ініціалізація трьох приватних полів класу Impôts
- рядок 32: метод calculer класу Impôts дозволяє обчислити податок платника податків.
- рядки 65–78: клас Utilitaires
- рядки 89–94: створення об’єкта Impôts з обробкою можливого винятку. Під час створення об’єкта використовується текстовий файл $IMPOTS для заповнення трьох приватних полів об’єкта Impôts його вмістом.
- рядок 96: створення об’єкта Utilitaires для використання функції cutNewLineChar.