Skip to content

6. 应用练习——使用对象进行税费计算 (impots_03)

我们将重温之前学习的练习(第 4.2 4.3 节),并使用利用类的 PHP 代码来解决它。


<?php
 
// definition of a Tax class
class Impôts {
 
  // attributes: the 3 data tables
  private $limites;
  private $coeffR;
  private $coeffN;
 
  // manufacturer
 
  public function __construct($IMPOTS) {
    // $IMPOTS: name of the file containing data from tables $limites, $coeffR, $coeffN
    // does the $IMPOTS file exist?
    if (!file_exists($IMPOTS)) {
      throw new Exception("Le fichier $IMPOTS n'existe pas");
    }//if
    // file block playback
    $tables = file($IMPOTS);
    if (!$tables) {
      throw new Exception("Erreur lors de l'exploitation du fichier $IMPOTS");
    }//if
    // create the 3 tables - assume the rows are syntactically correct
    $u = new Utilitaires(); // p// for utility functions
    $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é : yes, no
    // $enfants : number of children
    // $salaire: annual salary
 
    // number of shares
    $marié = strtolower($marié);
    if ($marié == "oui")
      $nbParts = $enfants / 2 + 2;
    else
      $nbParts=$enfants / 2 + 1;
    // an additional 1/2 share if at least 3 children
    if ($enfants >= 3)
      $nbParts+=0.5;
    // taxable income
    $revenuImposable = 0.72 * $salaire;
    // family quotient
    $quotient = $revenuImposable / $nbParts;
    // is set at the end of the limit table to stop the following loop
    $this->limites[count($this->limites) - 1] = $quotient;
    // tAX CALCULATION
    $i = 0;
    while ($quotient > $this->limites[$i])
      $i++;
    // because $quotient has been placed at the end of the $limites array, the previous loop
    // cannot exceed the table $limites
    // now we can calculate the tax
    return floor($revenuImposable * $this->coeffR[$i] - $nbParts * $this->coeffN[$i]);
  }
 
}
 
// a class of utility functions
class Utilitaires {
 
  public function cutNewLinechar($ligne) {
    // delete the end-of-line mark from $ligne if it exists
    $L = strlen($ligne);  // lo// line length
    while (substr($ligne, $L - 1, 1) == "\n" or substr($ligne, $L - 1, 1) == "\r") {
      $ligne = substr($ligne, 0, $L - 1);
      $L--;
    }//wh//while
    // end
    return($ligne);
  }
 
}
 
// test -----------------------------------------------------
// definition of constants
$DATA = "data.txt";
$RESULTATS = "resultats.txt";
$IMPOTS = "impots.txt";
// the data required to calculate the tax has been placed in the IMPOTS file
// one line per table in the form
// "val1":"val2":"val3",...
// create a Tax object
try {
  $I = new Impôts($IMPOTS);
} catch (Exception $e) {
  print $e->getMessage();
  exit;
}
// create a utilities object
$u = new Utilitaires();
 
// reading user data
$data = fopen($DATA, "r");
if (!$data) {
  print "Impossible d'ouvrir en lecture le fichier des données [$DATA]\n";
  exit;
}
 
// open results file
$résultats = fopen($RESULTATS, "w");
if (!$résultats) {
  print "Impossible de créer le fichier des résultats [$RESULTATS]\n";
  exit;
}
 
// use the current line of the data file
while ($ligne = fgets($data, 100)) {
  // remove any end-of-line marker
  $ligne = $u->cutNewLineChar($ligne);
  // we retrieve the 3 fields married,children,salary which form $ligne
  list($marié, $enfants, $salaire) = explode(",", $ligne);
  // tax calculation
  $impôt = $I->calculer($marié, $enfants, $salaire);
  // enter the result
  fputs($résultats, "$marié:$enfants:$salaire:$impôt\n");
  // following data
}// while
// close files
fclose($data);
fclose($résultats);
 
// end
print "Terminé\n";
exit;
?>

[taxes.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

结果:与表格和文件版本中已获得的结果一致。

文件 [results.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 行:Taxes 类。它封装了用于计算税款的数据和方法:
  • 数据:第 7–9 行——这是用于计算税款的三个数据数组。这三个数组由第 13 行的构造函数从文本文件中初始化。
  • 方法:第 32 行——*calculate* 方法用于计算税额。
  • 第 17、22 行:当构造函数无法创建 Taxes 对象时,会抛出异常。
  • 第 25 行:定义了 Utilities 类,用于封装 cutNewLineChar 函数。
  • 第 26–28 行:初始化 Taxes 类的三个私有字段
  • 第 32 行:*Taxes 类的 *calculate 方法用于计算纳税人的税额。
  • 第 65–78 行:Utilities
  • 第 89–94 行:创建一个带有异常处理的 Taxes 对象。此创建过程将使用 $IMPOTS 文本文件来填充 Taxes 对象的三个私有字段。
  • 第 96 行:创建一个 Utilities 对象以调用 cutNewLineChar 函数。