Skip to content

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]

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

نتایج: آن‌هایی که قبلاً در نسخه‌های دارای جداول و فایل‌ها به‌دست آمده‌اند.

فایل [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 در دسترس قرار گیرد.