Skip to content

6. Uygulama alıştırması - IMPOTS ve nesneler (impots_03)

Daha önce incelenen alıştırmayı (4.2 ve 4.3. paragraflar) bir sınıf kullanan PHP koduyla çözmek üzere tekrar ele alıyoruz.


<?php

// "Vergiler" sınıfının tanımlanması
class Impôts {

  // özellikler: 3 veri dizisi
  private $limites;
  private $coeffR;
  private $coeffN;
  
  // oluşturucu

  public function __construct($IMPOTS) {
    // $IMPOTS: $limites, $coeffR, $coeffN tablolarının verilerini içeren dosyanın adı
    // $IMPOTS dosyası mevcut mu?
    if (!file_exists($IMPOTS)) {
      throw new Exception("Le fichier $IMPOTS n'existe pas");
    }//if
    // dosyanın toplu olarak okunması
    $tables = file($IMPOTS);
    if (!$tables) {
      throw new Exception("Erreur lors de l'exploitation du fichier $IMPOTS");
    }//if
    // 3 tablonun oluşturulması - satırların sözdizimsel olarak doğru olduğu varsayılır
    $u = new Utilitaires(); // yardımcı işlevlere sahip olmak için
    $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é: evet, hayır
    // $enfants: çocuk sayısı
    // $salaire : yıllık maaş
    
    // pay sayısı
    $marié = strtolower($marié);
    if ($marié == "oui")
      $nbParts = $enfants / 2 + 2;
    else
      $nbParts=$enfants / 2 + 1;
    // en az 3 çocuk varsa 1/2 hisse daha
    if ($enfants >= 3)
      $nbParts+=0.5;
    // vergilendirilebilir gelir
    $revenuImposable = 0.72 * $salaire;
    // aile katsayısı
    $quotient = $revenuImposable / $nbParts;
    // takip eden döngüyü durdurmak için sınırlar tablosunun sonuna eklenir
    $this->limites[count($this->limites) - 1] = $quotient;
    // vergi hesaplaması
    $i = 0;
    while ($quotient > $this->limites[$i])
      $i++;
    // $quotient'in $limites tablosunun sonuna yerleştirilmesi nedeniyle, önceki döngü
    // $limites tablosunun sınırlarını aşamaz
    // artık vergiyi hesaplayabiliriz
    return floor($revenuImposable * $this->coeffR[$i] - $nbParts * $this->coeffN[$i]);
  }

}

// bir yardımcı işlev sınıfı
class Utilitaires {

  public function cutNewLinechar($ligne) {
    // varsa, $ligne'ten satır sonu işaretini siliyoruz
    $L = strlen($ligne);  // satır uzunluğu
    while (substr($ligne, $L - 1, 1) == "\n" or substr($ligne, $L - 1, 1) == "\r") {
      $ligne = substr($ligne, 0, $L - 1);
      $L--;
    }//while
    // son
    return($ligne);
  }

}

// test -----------------------------------------------------
// sabitlerin tanımı
$DATA = "data.txt";
$RESULTATS = "resultats.txt";
$IMPOTS = "impots.txt";
// vergi hesaplaması için gerekli veriler IMPOTS dosyasına yerleştirilmiştir
// tablolar için her bir satırda şu biçimde
// "val1":"val2":"val3",...
// bir Vergi nesnesi oluşturulur
try {
  $I = new Impôts($IMPOTS);
} catch (Exception $e) {
  print $e->getMessage();
  exit;
}
// bir yardımcı nesne oluşturulur
$u = new Utilitaires();

// kullanıcı verilerini okuma
$data = fopen($DATA, "r");
if (!$data) {
  print "Impossible d'ouvrir en lecture le fichier des données [$DATA]\n";
  exit;
}

// sonuç dosyasını açma
$résultats = fopen($RESULTATS, "w");
if (!$résultats) {
  print "Impossible de créer le fichier des résultats [$RESULTATS]\n";
  exit;
}

// veri dosyasının geçerli satırı işleniyor
while ($ligne = fgets($data, 100)) {
  // varsa satır sonu işaretini kaldırma
  $ligne = $u->cutNewLineChar($ligne);
  // $ligne'i oluşturan "evli", "çocuk" ve "maaş" olmak üzere 3 alanı alınır
  list($marié, $enfants, $salaire) = explode(",", $ligne);
  // vergi hesaplanır
  $impôt = $I->calculer($marié, $enfants, $salaire);
  // sonuç yazılır
  fputs($résultats, "$marié:$enfants:$salaire:$impôt\n");
  // sonraki veri
}// while
// dosyalar kapatılır
fclose($data);
fclose($résultats);

// son
print "Terminé\n";
exit;
?>

[impots.txt] dosyası:

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] dosyası

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

Sonuçlar: Tablolar ve dosyalar içeren sürümlerde elde edilen sonuçlarla aynıdır.

[resultats.txt] dosyası

oui:2:200000:22504
non:2:200000:33388
oui:3:200000:16400
non:3:200000:22504
oui:5:50000:0
non:0:3000000:1354938

Açıklamalar

    1. satır: Impôts sınıfı. Bu sınıf, verginin hesaplanmasına olanak tanıyan verileri ve yöntemleri içerir:
  • veriler: 7-9. satırlar – bunlar, verginin hesaplanmasını sağlayan üç veri dizisidir. Bu üç dizi, 13. satırdaki oluşturucu tarafından bir metin dosyasından başlatılır.
  • yöntemler: 32. satır – calculer yöntemi, verginin hesaplanmasını sağlar.
    1. ve 22. satırlar: Oluşturucu, Impôts nesnesini oluşturamadığında bir istisna oluşturur.
    1. satır: Utilitaires sınıfı, cutNewLineChar işlevini kapsüllemek üzere tanımlanmıştır.
  • 26-28. satırlar: Impôts sınıfının üç özel alanının başlatılması
    1. satır: Impôts sınıfının calculer yöntemi, bir vergi mükellefinin vergisini hesaplamaya olanak tanır.
  • 65-78. satırlar: Utilitaires sınıfı
  • satır 89-94: Olası istisnaların yönetimi ile birlikte bir Impôts nesnesinin oluşturulması. Bu işlem, $IMPOTS metin dosyasını kullanarak içeriğini Impôts nesnesinin üç özel alanına aktaracaktır.
    1. satır: cutNewLineChar işlevini kullanabilmek için Utilitaires nesnesinin oluşturulması.