11. IMPOTS alıştırması, WEB hizmeti ve üç katmanlı mimari ile
IMPOTS alıştırmasını (bkz. paragraf 4.2, 4.3, 6) ele alacağız ve bunu bir istemci/sunucu uygulaması haline getireceğiz. Sunucu komut dosyası üç bileşene ayrılacaktır:
- [dao] (Veri Erişim Nesneleri) adlı katman, MySQL veritabanıyla olan iletişimden sorumlu olacak
- [métier] adlı katman, vergi hesaplamasını gerçekleştirecek
- web müşterileriyle iletişimi sağlayacak olan [web] adlı katman.
![]() |
[1] istemci komut dosyası:
- vergi hesaplaması için gerekli olan üç bilgiyi ($marié, $enfants, $salaire) sunucu komut dosyasına iletir
- sunucunun yanıtını konsolda görüntüler
[2] sunucu komut dosyası, sunucunun [web] katmanından oluşur.
- Yeni bir istemci oturumu başladığında, MySQL ve [dbimpots] veritabanlarındaki verileri tablolara yerleştirir. Bunun için [dao] katmanını kullanır. Bu şekilde oluşturulan tablolar, müşterinin sonraki sorgularında kullanılabilmesi için müşteri oturumuna yerleştirilecektir.
- Bir istemci isteği sırasında, şu üç bilgiyi aktaracaktır ($marié, $enfants, $salaire) [métier] katmanına iletecek ve bu katman da $impot vergisini hesaplayacaktır.
- Sunucu komut dosyası, hesaplanan $impôt vergisini geri gönderecektir.
11.1. İstemci komut dosyası (clients_impots_05_web)
İstemci komut dosyası, vergi hesaplama web hizmetinin bir istemcisi olacaktır. Sunucuya (POST) şu biçimde parametreler gönderecektir:
params=$evli,$çocuk,$maaş burada
- $marié, oui veya non dizesi olacak,
- $enfants çocuk sayısı,
- $salaire ise vergi mükellefinin maaşıdır
Yukarıdaki üç parametreyi, (evli, çocuk sayısı, maaş) biçiminde [data.txt] adlı bir metin dosyasında bulur:
İstemci komut dosyası
- [data.txt] metin dosyasını satır satır okuyacak
- params=$marié,$enfants,$salaire dizesini vergi hesaplama web hizmetine gönderecek
- hizmetten yanıtı alacaktır. Bu yanıt iki şekilde olabilir:
- sunucunun yanıtını, aşağıdaki iki biçimden birinde [resultats.txt] adlı bir metin dosyasına kaydedecektir:
İstemci komut dosyasının kodu şöyledir:
<?php
// vergi mükellefi
// hata yönetimi
ini_set("display_errors", "off");
// ---------------------------------------------------------------------------------
// yardımcı işlevler sınıfı
class Utilitaires {
function cutNewLinechar($ligne) {
...
}
}
// ana işlev -----------------------------------------------------
// sabitlerin tanımı
$DATA = "data.txt";
$RESULTATS = "resultats.txt";
// sunucu verileri
$HOTE = "localhost";
$PORT = 80;
$urlServeur = "/exemples-web/impots_05_web.php";
// Vergi mükelleflerinin bilgileri (medeni durum, çocuk sayısı, yıllık maaş)
// vergi mükellefi başına bir satır olacak şekilde $DATA metin dosyasına yerleştirilmiştir
// sonuçlar (medeni durum, çocuk sayısı, yıllık gelir, ödenecek vergi)
// veya (medeni durum, çocuk sayısı, yıllık gelir, hata mesajı)
// $RESULTATS metin dosyasına her satıra bir sonuç olacak şekilde yerleştirilir
// Yardımcı Programlar sınıfı
$u = new Utilitaires();
// vergi mükelleflerinin verilerinin bulunduğu dosyanın açılması
$data = fopen($DATA, "r");
if (!$data) {
print "Impossible d'ouvrir en lecture le fichier des données [$DATA]\n";
exit;
}
// sonuç dosyasının açılması
$résultats = fopen($RESULTATS, "w");
if (!$résultats) {
print "Impossible de créer le fichier des résultats [$RESULTATS]\n";
exit;
}
// vergi mükellefi verileri dosyasının geçerli satırını işliyoruz
while ($ligne = fgets($data, 100)) {
// varsa satır sonu işaretini kaldırma
$ligne = $u->cutNewLineChar($ligne);
// $ligne'i oluşturan "evli:çocuk sayısı:maaş" şeklindeki 3 alanı alınır
list($marié, $enfants, $salaire) = explode(",", $ligne);
// vergi hesaplanıyor
list($erreur, $impôt) = calculerImpot($HOTE, $PORT, $urlServeur, $cookie, array($marié, $enfants, $salaire));
// sonuç yazılır
$résultat = $erreur ? "$marié:$enfants:$salaire:$erreur" : "$marié:$enfants:$salaire:$impôt";
fputs($résultats, "$résultat\n");
// sonraki veri
}
// dosyalar kapatılır
fclose($data);
fclose($résultats);
// son
print "Terminé...\n";
exit;
function calculerImpot($HOTE, $PORT, $urlServeur, &$cookie, $params) {
// müşteriyi ($HOTE,$PORT,$urlServeur) adreslerine bağlar
//, $cookie çerezi boş değilse bunu gönderir. $cookie referans olarak aktarılır
//, $params'i sunucuya gönderir
//, sunucu tarafından geri gönderilen tek satırı işler
//, $HOTE'in 80 numaralı bağlantı noktasında bir bağlantı açıyor
$connexion = fsockopen($HOTE, $PORT);
// hata mı?
if (!$connexion)
return array("erreur lors de la connexion au serveur ($HOTE, $PORT)");
// HTTP protokolünün başlıkları (headers) boş bir satırla bitmelidir
// POST
fputs($connexion, "POST $urlServeur HTTP/1.1\n");
// Ana Bilgisayar
fputs($connexion, "Host: localhost\n");
// Bağlantı
fputs($connexion, "Connection: close\n");
// Çerez boş değilse gönderilir
if ($cookie) {
fputs($connexion, "Cookie: $cookie\n");
}//if
// şimdi komutu kodladıktan sonra istemciye gönderilir
$infos = "params=" . urlencode(implode(",", $params));
// hangi tür bilgilerin gönderileceğini belirtilir
fputs($connexion, "Content-type: application/x-www-form-urlencoded\n");
// gönderilecek bilgilerin boyutu (karakter sayısı) gönderilir
fputs($connexion, "Content-length: " . strlen($infos) . "\n");
// boş bir satır gönderiliyor
fputs($connexion, "\n");
// bilgiler gönderilir
fputs($connexion, $infos);
// web sunucusunun yanıtı görüntülenir
// ve varsa çerezi almaya özen gösterilir
while ($ligne = fgets($connexion, 1000)) {
// çerez - yalnızca ilk yanıtta
if (!$cookie) {
if (preg_match("/^Set-Cookie: (.*?)\s*$/", $ligne, $champs)) {
$cookie = $champs[1];
}//if
}
// yanıtta boş bir satır görüldüğü anda HTTP yanıtı sona erer
if (trim($ligne) == "") {
break;
}
}//while
// sonuç satırını okuma
$ligne = fgets($connexion, 1000);
// bağlantı kapatılır
fclose($connexion);
// sonuç hesaplanıyor
$erreur="";
$impôt="";
if (preg_match("/^<erreur>(.*?)<\/erreur>\s*$/", $ligne, $champs)) {
$erreur = $champs[1];
} else {
if (preg_match("/^<impot>(.*?)<\/impot>\s*$/", $ligne, $champs)) {
$impôt = $champs[1];
}else{
$erreur="résultat du serveur non exploitable";
}
}
// geri dönüş
return array($erreur, $impôt);
}
Açıklamalar
İstemci komut dosyası kodu, daha önce gördüğümüz unsurları içermektedir:
- 9-15. satırlar: [Utilitaires] sınıfı, 3. sürümün 6. paragrafında tanıtılmıştır
- 17-68. satırlar: ana program, sürüm 1'in 4.2. paragrafındaki programa benzerdir. Aradaki tek fark, 56. satırdaki vergi hesaplamasıdır.
- 56. satır: Vergi hesaplama fonksiyonu aşağıdaki parametreleri kabul eder:
- $HOTE, $PORT, $urlServeur: web hizmetine bağlanmayı sağlar
- $cookie: oturum çerezi. Bu parametre referans yoluyla aktarılır. Değeri, vergi hesaplama fonksiyonu tarafından belirlenir. İlk çağrıda bir değeri yoktur. Sonraki çağrılarda bir değeri olur.
- array($marié, $enfants, $salaire): [data.txt] dosyasının bir satırını temsil eder
Vergi hesaplama fonksiyonu, iki sonuç içeren bir dizi döndürür ($erreur, $impôt); burada $erreur olası bir hata mesajı, $impôt ise vergi tutarıdır.
- 70 – 134. satırlar: Burada, daha önce pek çok kez karşılaştığımız klasik bir HTTP istemcisi bulunmaktadır. Aşağıdaki noktalara dikkat edilmelidir:
- 83. satır: Parametreler ($marié, $enfants, $salaire), bir POST aracılığıyla sunucuya iletilir
- 89-91. satırlar: İstemcinin bir oturum kimliği varsa, bunu sunucuya gönderir
- 93. satır: params parametresinin oluşturulması
- satır 101: params parametresinin gönderilmesi
- 104-115. satırlar: İstemci, başlıkların sonunu belirten boş satıra rastlayana kadar sunucu tarafından gönderilen tüm HTTP başlıklarını okur. Bu sırada, ilk isteğine verilen yanıtta oturum kimliğini alır.
- 123-125. satırlar: <erreur>message</erreur> biçimindeki olası bir satır işlenir
- 126-128. satırlar: <impot>montant</impot> biçimindeki olası bir satır için de aynı işlem yapılır
- 133. satır: Sonuç verilir
11.2. Vergi hesaplama web hizmeti
Burada, sunucuyu oluşturan üç komut dosyasına odaklanacağız:
![]() |
İlgili NetBeans projesi şöyledir:
![]() |
[1]'te sunucu, aşağıdaki PHP komut dosyalarından oluşur:
- [impots_05_entites], sunucu tarafından kullanılan sınıfları içerir
- [impots_05_dao], [dao] katmanının sınıflarını ve arayüzlerini içerir
- [impots_05_metier], [metier] katmanının sınıflarını ve arayüzlerini içerir
- [impots_05_web], [dao] katmanının sınıflarını ve arayüzlerini içerir
Öncelikle, web hizmetinin farklı katmanları tarafından kullanılan iki sınıfı tanıtacağız.
11.2.1. Web hizmetinin varlıkları (impots_05_entites)
MySQL [dbimpots] veritabanında, [1] vergisinin hesaplanması için gerekli verileri içeren [impots] tablosu bulunmaktadır:
![]() |
MySQL ve [impots] tablolarındaki verileri, Tranche nesne dizisinde depolayacağız; burada Tranche aşağıdaki sınıftır:
<?php
// bir vergi dilimi
class Tranche {
// özel alanlar
private $limite;
private $coeffR;
private $coeffN;
// alıcı ve ayarlayıcılar
public function getLimite() {
return $this->limite;
}
public function setLimite($limite) {
$this->limite = $limite;
}
public function getCoeffR() {
return $this->coeffR;
}
public function setCoeffR($coeffR) {
$this->coeffR = $coeffR;
}
public function getCoeffN() {
return $this->coeffN;
}
public function setCoeffN($coeffN) {
$this->coeffN = $coeffN;
}
// yapıcı
public function __construct($limite, $coeffR, $coeffN) {
$this->setLimite($limite);
$this->setCoeffR($coeffR);
$this->setCoeffN($coeffN);
}
// toString
public function __toString(){
return "[$this->limite,$this->coeffR,$this->coeffN]";
}
}
[$limite, $coeffR, $coeffN] özel alanları, MySQL ve [impots] tablolarındaki bir satırın [limites, coeffR, coeffN] sütunlarını depolamak için kullanılacaktır.
Ayrıca, sunucu kodu kendisine özgü bir istisna olan ImpotsException sınıfını kullanacaktır:
- 1. satır: [ImpotsException] sınıfı, PHP 5'te önceden tanımlanmış olan [Exception] sınıfından türetilmiştir
- 3. satır: [ImpotsException] sınıfının oluşturucusu iki parametre kabul eder:
- $message: bir hata mesajı
- $code: bir hata kodu
11.2.2. [dao] katmanı (impots_05_dao)
[dao] katmanı, veritabanındaki verilere erişim sağlar:
![]() |
[dao] katmanı aşağıdaki arayüzü sunar:
IImpotsDao arayüzü yalnızca getData işlevini sunar. Bu işlev, Tranche nesne dizisine, MySQL ve [dbimpots.impots] tablolarının farklı satırlarını yerleştirir.
Uygulama sınıfı şöyledir:
<?php
// Dao katmanı
// bağımlılıklar
require_once "impots_05_entites.php";
// sabitler
define("TABLE", "impots");
// -----------------------------------------------------------------
// soyut uygulama
abstract class ImpotsDaoWithPdo implements IImpotsDao {
// özel alanlar
private $dsn;
private $user;
private $passwd;
private $tranches;
// alıcı ve ayarlayıcılar
public function getDsn() {
return $this->dsn;
}
public function setDsn($dsn) {
$this->dsn = $dsn;
}
public function getUser() {
return $this->user;
}
public function setUser($user) {
$this->user = $user;
}
public function getPasswd() {
return $this->passwd;
}
public function setPasswd($passwd) {
$this->passwd = $passwd;
}
// yapıcı
public function __construct($dsn, $user, $passwd) {
// parametreleri kaydediyoruz
$this->setDsn($dsn);
$this->setUser($user);
$this->setPasswd($passwd);
// SGBD'ten verileri alıyoruz
// ($user, $pwd) $dsn veritabanına bağlanır
try {
// bağlantı
$connexion = new PDO($dsn, $user, $passwd, array(PDO::ATTR_PERSISTENT => true));
// $TABLE tablosunu okur
$requête = "select limites,coeffR,coeffN from " . TABLE;
// $requête sorgusunu $connexion bağlantısı üzerinden yürütür
$statement = $connexion->prepare($requête);
$statement->execute();
// sorgu sonucunun işlenmesi
while ($colonnes = $statement->fetch()) {
$this->tranches[] = new Tranche($colonnes[0], $colonnes[1], $colonnes[2]);
}
// bağlantı kesiliyor
$connexion=NULL;
} catch (PDOException $e) {
// hata ile geri dönüş
throw new ImpotsException($e->getMessage(), 1);
}
}
public function getData(){
return $this->tranches;
}
}
- 5. satır: [IImpotsDao] arayüzünün uygulaması, [impots_05_entites] betiğinde tanımlanan sınıflara ihtiyaç duyar.
- 11. satır: Soyut sınıf tanımı. Soyut sınıf, örneklenemeyen bir sınıftır. Soyut bir sınıfın örneklenebilmesi için mutlaka bir alt sınıftan türetilmesi gerekir. Bir sınıf, örneklenemediği için (bazı yöntemleri tanımlanmamış olduğu için) veya örneklenmesini istemediğimiz için soyut olarak ilan edilebilir. Burada, [ImpotsDaoWithPdo] sınıfını örneklendirmek istemiyoruz. Bunun yerine, bu sınıftan türetilen sınıfları örneklendireceğiz.
- 11. satır: [ImpotsDaoWithPdo] sınıfı, [IImpotsDao] arayüzünü uygular. Dolayısıyla, getData yöntemini tanımlaması gerekir. Bu yöntem 72-74. satırlarda bulunur.
- 14. satır: $dsn (Veri Kaynağı Adı), SGBD'i ve kullanılan veritabanını benzersiz bir şekilde tanımlayan bir karakter dizisidir.
- 15. satır: $user, veritabanına bağlanan kullanıcıyı tanımlar
- 16. satır: $passwd, önceki kullanıcının şifresidir
- 17. satır: $tranches, Tranche nesne dizisidir; bu diziye MySQL ve [dbimpots.impots] tabloları kaydedilecektir.
- 45-70. satırlar: Sınıf oluşturucu. Bu kod, sürüm 4'ün 8.2. paragrafında daha önce ele alınmıştı. [ImpotsDaoWithPdo] nesnesinin oluşturulmasının başarısız olabileceği unutulmamalıdır. Bu durumda [ImpotsException] türünde bir istisna atılır.
- 72-74. satırlar: [IImpotsDao] arayüzünün [getData] yöntemi.
[ImpotsDaoWithPdo] sınıfı, tüm SGBD nesneleri için uygundur. Sınıfın oluşturucusu (45. satır), veritabanının Veri Kaynağı Adını (Data Source Name) bilmeyi gerektirir. Bu karakter dizisi, kullanılan SGBD nesnesine bağlıdır. Sınıf kullanıcısının bu Veri Kaynağı Adını bilmesini zorunlu kılmamayı tercih ettik. Her bir SGBD için, [ImpotsDaoWithPdo]'ten türetilmiş özel bir sınıf olacaktır. SGBD ve MySQL için bu sınıf şu şekilde olacaktır:
class ImpotsDaoWithMySQL extends ImpotsDaoWithPdo {
public function __construct($host, $port, $base, $user, $passwd) {
parent::__construct("mysql:host=$host;dbname=$base;port=$port", $user, $passwd);
}
}
- 3. satırda, üretici Veri Kaynağı Adı’nı istemiyor, sadece SGBD ($host) sunucusunun adını, dinleme bağlantı noktasını ($port) ve veritabanının adını ($base).
- 4. satırda, MySQL veritabanının Veri Kaynağı Adı oluşturulur ve üst sınıfın oluşturucusunu çağırmak için kullanılır.
Başka bir SGBD'e uyum sağlamak için, uygun olan [ImpotsDaoWithPdo]'ten türetilmiş sınıfı yazmak yeterlidir. Her seferinde, kullanılan SGBD'e özgü Veri Kaynağı Adı oluşturulmalıdır.
11.2.3. [métier] katmanı (impots_05_metier)
[metier] katmanı, vergi hesaplama mantığını içerir:
![]() |
[métier] katmanı aşağıdaki arayüzü sunar:
<?php
// işletme arayüzü
interface IImpotsMetier {
public function calculerImpot($marié, $enfants, $salaire);
}
[IImpotsMetier] arayüzü, yalnızca bir yöntem sunar: [calculerImpot] yöntemi, aşağıdaki parametreleri kullanarak bir vergi mükellefinin vergisini hesaplamaya olanak tanır:
- $marié: Vergi mükellefinin evli olup olmadığına göre "evli" veya "evli değil" şeklinde bir dize
- $enfants: vergi mükellefinin çocuk sayısı
- $salaire: vergi mükellefinin maaşı
Bu parametreleri ona sağlayacak olan katman [web]'tir.
[IImpotsMetier] arayüzünün uygulaması şu şekildedir:
// bağımlılıklar
require_once "impots_05_dao.php";
// ------------------------------------------------------------------
// uygulama sınıfı
class ImpotsMetier implements IImpotsMetier {
// DAO katmanı
private $dao;
// nesne dizisi [Tranche]
private $data;
// getter ve setter
public function getDao() {
return $this->dao;
}
public function setDao($dao) {
$this->dao = $dao;
}
public function setData($data){
$this->data=$data;
}
public function __construct($dao) {
// vergi hesaplaması için gerekli veriler alınır
$this->setDao($dao);
$this->setData($this->dao->getData());
}
public function calculerImpot($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
$N = count($this->data);
$this->data[$N - 1]->setLimite($quotient);
// vergi hesaplaması
$i = 0;
while ($i < $N and $quotient > $this->data[$i]->getLimite()) {
$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->data[$i]->getCoeffR() - $nbParts * $this->data[$i]->getCoeffN());
}
}
- 2. satır: [métier] katmanı, [dao] katmanındaki sınıflara ve varlıklara (Tranche, ImpotsException) ihtiyaç duyar.
- 6. satır: [ImpotsMetier] sınıfı, [IimpotsMetier] arayüzünü uygular.
- 9-11. satırlar: Sınıfın özel alanları:
- $dao: [dao] katmanına referans
- $data: [dao] katmanı tarafından sağlanan [Tranche] türündeki nesnelerden oluşan dizi
- 26-30. satırlar: Sınıfın oluşturucusu, önceki iki alanı başlatır. Parametre olarak [dao] katmanına bir referans alır.
- satır 32-61: [IimpotsMetier] arayüzünün [calculerImpot] yönteminin uygulaması. Bu yöntem, sürüm 1'den itibaren karşımıza çıkmıştır (paragraf 4.2).
11.2.4. [web] katmanı (impots_05_web)
[metier] katmanı, vergi hesaplama mantığını içerir:
![]() |
[web] katmanı, web istemcilerine yanıt veren web hizmetinden oluşur. Hatırlanacağı üzere, web istemcileri şu parametreyi göndererek web hizmetine bir istek gönderir: params=marié,enfants,salaire. Burada, önceki paragraflarda oluşturduğumuz türden bir web hizmetiyle karşı karşıyayız. Kod şöyledir:
<?php
// iş mantığı katmanı
require_once "impots_05_metier.php";
// hata yönetimi
ini_set("display_errors", "off");
// başlık UTF-8
header("Content-Type: text/plain; charset=utf-8");
// ------------------------------------------------------------------------------
// vergi web hizmeti
// sabitlerin tanımlanması
$HOTE = "localhost";
$PORT = 3306;
$BASE = "dbimpots";
$USER = "root";
$PWD = "";
// vergi hesaplaması için gerekli veriler, IMPOTS adlı MySQL tablosuna yerleştirilmiştir
// tabloya yerleştirilmiştir. Bu tablo, $BASE veritabanına aittir. Tablonun yapısı aşağıdaki gibidir
// sınırlar decimal(10,2), coeffR decimal(6,2), coeffN decimal(10,2)
// vergi mükelleflerine ait parametreler (medeni durum, çocuk sayısı, yıllık maaş)
// müşteri tarafından params=medeni durum, çocuk sayısı, yıllık maaş biçiminde gönderilir
// sonuçlar (medeni durum, çocuk sayısı, yıllık maaş, ödenecek vergi) müşteriye geri gönderilir
// <impot>impot</impot> biçiminde
// veya <hata>hata</hata> biçiminde, parametreler geçersizse
// oturumunda [métier] katmanı alınır
session_start();
if (!isset($_SESSION['metier'])) {
// [dao] katmanı ve [métier] katmanının örneklenmesi
try {
$_SESSION['metier'] = new ImpotsMetier(new ImpotsDaoWithMySQL($HOTE, $PORT, $BASE, $USER, $PWD));
} catch (ImpotsException $ie) {
print "<erreur>Erreur : " . utf8_encode($ie->getMessage() . "</erreur>");
exit;
}
}
$metier = $_SESSION['metier'];
// istemci tarafından gönderilen satır alınır
$params = utf8_encode(htmlspecialchars(strtolower(trim($_POST['params']))));
$items = explode(",", $params);
// sadece 3 parametre olmalı
if (count($items) != 3) {
print "<erreur>[$params] : nombre de paramètres invalides</erreur>\n";
exit;
}//if
// ilk parametre (medeni durum) evet/hayır olmalıdır
$marié = trim($items[0]);
if ($marié != "oui" and $marié != "non") {
print "<erreur>[$params] : 1er paramètre invalide</erreur>\n";
exit;
}//if
// ikinci parametre (çocuk sayısı) bir tamsayı olmalıdır
if (!preg_match("/^\s*(\d+)\s*$/", $items[1], $champs)) {
print "<erreur>[$params] : 2ième paramètre invalide</erreur>\n";
exit;
}//if
$enfants = $champs[1];
// üçüncü parametre (maaş) bir tamsayı olmalıdır
if (!preg_match("/^\s*(\d+)\s*$/", $items[2], $champs)) {
print "<erreur>[$params] : 3ième paramètre invalide</erreur>\n";
exit;
}//if
$salaire = $champs[1];
// vergi hesaplanır
$impôt = $metier->calculerImpot($marié, $enfants, $salaire);
// sonuç döndürülür
print "<impot>$impôt</impot>\n";
// son
exit;
- 4. satır: [web] katmanı, [métier] katmanındaki sınıflara ihtiyaç duyar
- 30-40. satırlar: [métier] katmanına yapılan referans oturumda tutulur. Bu [métier] katmanının [dao] katmanına bir referansı olduğunu ve sonuncusunun SGBD verilerini sakladığını hatırlarsak, şunu anlayabiliriz:
- Müşterinin ilk isteği, SGBD katmanına erişim sağlayacaktır
- aynı müşterinin sonraki istekleri ise [dao] katmanı tarafından saklanan verileri kullanacaktır. Dolayısıyla SGBD'e erişim gerçekleşmez.
- 34. satır: SGBD için uygulanan [dao] katmanıyla birlikte çalışan bir [métier] katmanının oluşturulması MySQL
- 35-37. satırlar: Önceki işlemde meydana gelebilecek bir hatanın yönetimi. Bu durumda, müşteriye bir <erreur>message</erreur> satırı gönderilir.
- 43. satır: Müşteri tarafından gönderilen 'params' parametresi alınır.
- 46-49. satırlar: 'params' içinde bulunan bilgi sayısını kontrol ederiz
- 51-55. satırlar: İlk bilginin geçerliliği kontrol edilir
- 56-60. satırlar: İkinci bilgi için de aynı işlem yapılır
- 62-66. satırlar: 3. bilgi için de aynı işlem yapılır
- 69. satır: Vergiyi hesaplayan katman [métier]'tir.
- 71. satır: Sonuç müşteriye gönderilir
Sonuçlar
Hatırlanacağı üzere, [client_impots_web_05] müşterisi aşağıdaki [data.txt] dosyasını kullanır:
Bu satırlardan (evli, çocuk sayısı, maaş) yola çıkarak, istemci vergi hesaplama sunucusuna sorgu gönderir ve sonuçları [resultats.txt] metin dosyasına kaydeder. İstemci çalıştırıldıktan sonra, bu dosyanın içeriği şu şekildedir:
oui:2:200000:22504
non:2:200000:33388
oui:3:200000:16400
non:3:200000:22504
oui:5:50000:0
non:0:3000000:1354938
burada her satır (evli, çocuk sayısı, maaş, hesaplanan vergi) biçimindedir.






