6. تمرين تطبيقي - IMPOTS مع الكائنات (impots_03)
نعود إلى التمرين الذي تمت دراسته سابقًا (الفقرتان 4.2 و4.3) لحله باستخدام كود PHP الذي يستخدم فئة.
<?php
// تعريف فئة «الضرائب»
class Impôts {
// السمات: الجداول الثلاثة للبيانات
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
// إنشاء الجداول الثلاثة - بافتراض أن الأسطر صحيحة من الناحية النحوية
$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;
// نصف حصة إضافية إذا كان هناك 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",...
// يتم إنشاء كائن Impôts
try {
$I = new Impôts($IMPOTS);
} catch (Exception $e) {
print $e->getMessage();
exit;
}
// يتم إنشاء كائن أدوات مساعدة
$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);
// استرجاع الحقول الثلاثة «متزوج» و«أطفال» و«الراتب» التي تشكل $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.