6. تمرین عملی – IMPOTS با اشیاء (impots_03)
ما به تمرینی که قبلاً پوشش داده شده است (بخشهای 4.2 و 4.3) بازمیگردیم تا آن را با استفاده از کد PHP که از یک کلاس بهره میبرد، حل کنیم.
<?php
// تعریف کلاس 'Taxes'
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");
}//اگر
// مسدود کردن خواندن فایل
$tables = file($IMPOTS);
if (!$tables) {
throw new Exception("Erreur lors de l'exploitation du fichier $IMPOTS");
}//اگر
// ایجاد ۳ جدول – با فرض درست بودن نحوی سطرها
$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;
// نیم سهم اضافی در صورت وجود حداقل ۳ فرزند
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--;
}//در حالی که
// پایان
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;
}
// یک شیء ابزارهای کمکی ایجاد میکند
$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);
//بازیابی سه فیلد «married»، «children» و «salary» که $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
توضیحات
- خط ۴: کلاس Taxes. این کلاس دادهها و متدهای محاسبه مالیات را در بر میگیرد:
- دادهها: خطوط ۷–۹ – اینها سه آرایهٔ دادهای هستند که برای محاسبهٔ مالیات استفاده میشوند. این سه آرایه توسط سازنده در خط ۱۳ از یک فایل متنی مقداردهی اولیه میشوند.
- متدها: خط ۳۲ – متد calculer مالیات را محاسبه میکند.
- خطوط 17 و 22: هنگامی که سازنده نتواند شیء Impôts را بسازد، یک استثنا پرتاب میکند.
- خط ۲۵: کلاس Utilitaires برای محصورسازی تابع cutNewLineChar تعریف شده است.
- خطوط 26–28: مقداردهی اولیه سه فیلد خصوصی کلاس Impôts
- خط ۳۲: متد calculer از کلاس Impôts برای محاسبه مالیات مودی استفاده میشود.
- خطوط ۶۵–۷۸: کلاس Utilitaires
- خطوط ۸۹–۹۴: ایجاد یک شیء Impôts با رسیدگی به هرگونه استثنا. این فرایند از فایل متنی $IMPOTS برای پر کردن سه فیلد خصوصی شیء Impôts با محتویات آن استفاده میکند.
- خط ۹۶: یک شیء Utilitaires ایجاد کنید تا تابع cutNewLineChar در دسترس قرار گیرد.