Skip to content

14. Anwendungsübung – Version 6

Image

Wir haben soeben die folgende Schichtstruktur implementiert:

Image

Das in den Beispielen verwendete SGBD war MySQL. Im Abschnitt „Link“ hatten wir festgestellt, dass nichts in der Klasse, die die Schicht [dao] implementiert, darauf hindeutete, dass ein bestimmtes SGBD verwendet wurde. Das werden wir nun überprüfen, indem wir ein anderes SGBD verwenden, nämlich das SGBD PostgreSQL. Die Schichtenarchitektur sieht nun wie folgt aus:

Image

14.1. Installation von SGBD und PostgreSQL

Die Distributionen von SGBD und PostgreSQL sind im URL und [https://www.postgresql.org/download/] (Mai 2019) verfügbar. Wir zeigen die Installation der Version für Windows 64-Bit:

Image

Image

  • Unter [1-4] laden Sie das Installationsprogramm für SGBD herunter;

Starten Sie das heruntergeladene Installationsprogramm:

Image

  • Geben Sie bei [6] einen Installationsordner an;

Image

  • bei [8] ist die Option [Stack Builder] für das, was wir hier tun wollen, nicht erforderlich;
  • Bei [10] behalten Sie den angezeigten Wert bei;

Image

  • Bei [12-13] haben wir hier das Passwort [root] eingegeben. Dies ist das Passwort des Administrators von SGBD, der [postgres] heißt. PostgreSQL bezeichnet ihn auch als Superuser;
  • bei [15] belassen Sie den Standardwert: Dies ist der Listening-Port von SGBD;

Image

  • In [17] belassen Sie den Standardwert;
  • in [19] die Zusammenfassung der Installationskonfiguration;

Image

Image

Unter Windows wird der Dienst „SGBD PostgreSQL“ als automatisch gestarteter Windows-Dienst installiert. In den meisten Fällen ist dies nicht wünschenswert. Wir werden diese Konfiguration ändern. Geben Sie „[services]“ in die Windows-Suchleiste ein:

Image

  • in [29]. Wir sehen, dass der Dienst SGBD PostgreSQL im automatischen Modus läuft. Wir ändern dies, indem wir die Eigenschaften des Dienstes [30] aufrufen:

Image

  • bei [31-32] den Startmodus auf „Manuell“ setzen;
  • bei [33] den Dienst beenden;

Wenn Sie den Dienst SGBD manuell starten möchten, kehren Sie zur Anwendung [services] zurück, klicken Sie mit der rechten Maustaste auf den Dienst [postgresql] (34) und starten Sie ihn (35).

14.2. Aktivierung der Erweiterung PDO von SGBD PostgreSQL

Wir werden die Datei [php.ini] bearbeiten, die PHP konfiguriert (siehe Abschnitt „Link“):

Image

  • in [2]. Vergewissern Sie sich, dass die Erweiterung PDO von PostgreSQL aktiviert ist. Speichern Sie anschließend die Änderung und starten Sie Laragon neu, um sicherzustellen, dass die Änderung übernommen wird. Überprüfen Sie anschließend die Konfiguration von PHP direkt in Laragon [3-5].

14.3. Verwalten Sie PostgreSQL mit dem Tool [pgAdmin]

Starten Sie den Windows-Dienst von SGBD PostgreSQL (siehe Abschnitt „Link“). Starten Sie anschließend, genau wie beim Tool [services], starten Sie das Tool [pgadmin], mit dem Sie die Dienste SGBD, PostgreSQL und [1-3] verwalten können:

Image

Möglicherweise werden Sie zu einem bestimmten Zeitpunkt nach dem Superuser-Passwort gefragt. Dieses lautet [postgres]. Sie haben dieses Passwort bei der Installation von SGBD festgelegt. In diesem Dokument haben wir dem Superuser bei der Installation das Passwort [root] zugewiesen.

  • Bei [4] ist [pgAdmin] eine Webanwendung;
  • in [5] die Liste der von [pgAdmin] erkannten Server PostgreSQL, hier 1;
  • in [6] der Server PostgreSQL, den wir gestartet haben;
  • in [7] die Datenbanken von SGBD, hier 1;
  • in [8] wird die Datenbank [postgresql] vom Superuser [postgres] verwaltet;

Erstellen wir zunächst einen Benutzer [admimpots] mit dem Passwort [mdpimpots]:

Image

Image

  • Bei [17] haben wir [mdpimpots] eingegeben;

Image

  • in [21] den Code SQL, den das Tool [pgAdmin] an SGBD und PostgreSQL ausgeben wird. Dies ist eine Möglichkeit, die proprietäre Sprache SQL von PostgreSQL zu erlernen;
  • In [22] wurde nach der Bestätigung des Assistenten [Save] der Benutzer [admimpots] angelegt;

Nun erstellen wir die Datenbank [dbimpots-2019]:

Image

Wir klicken mit der rechten Maustaste auf [23] und dann auf [24-25], um eine neue Datenbank anzulegen. Auf der Registerkarte „[26]“ legen wir den Namen der Datenbank „[27]“ und deren Eigentümer „[admimpots] [28]“ fest.

Image

  • in [30], den Code SQL für die Erstellung der Datenbank;
  • in [31]; nach Bestätigung des Assistenten [Save] wird die Datenbank [dbimpots-2019] erstellt;

Nun erstellen wir die Tabelle [tbtranches] mit den Spalten [id, limites, coeffr, coeffn]. Eine Besonderheit von PostgreSQL ist, dass bei den Spaltennamen die Groß- und Kleinschreibung beachtet werden muss, was bei den anderen SGBD normalerweise nicht der Fall ist. So funktioniert bei MySQL der Befehl [select limites, coeffR, coeffN from tbtranches] auch dann, wenn die tatsächlichen Spalten der Tabelle [tbtranches] [LIMITES, COEFFR, COEFFN] lauten. Bei PostgreSQL funktioniert der Befehl SQL nicht. Man könnte nun [select LIMITES, COEFFR, COEFFN from tbtranches] schreiben, aber das würde immer noch nicht funktionieren, da PostgreSQL den Befehl [select limites, coeffr, coeffn from tbtranches] ausführt: Standardmäßig werden die Spaltennamen in Kleinbuchstaben übergeben. Damit dies nicht geschieht, muss man schreiben: [select "LIMITES", "COEFFR", "COEFFN" from tbtranches], d. h. die Spaltennamen müssen in Anführungszeichen gesetzt werden. Aus diesen Gründen werden wir den Spalten Namen in Kleinbuchstaben geben. Die Namen der Objekte einer Datenbank können zu Inkompatibilitäten zwischen SGBD führen, da bestimmte Namen in einigen SGBD als reservierte Wörter gelten, in anderen jedoch nicht.

Wir erstellen die Tabelle [tbtranches]:

Image

  • Verwenden Sie die Schaltfläche [40], um Spalten anzulegen;

Image

Image

  • Nachdem der Assistent zur Erstellung über [Save] abgeschlossen wurde, wird die Tabelle [tbtranches] erstellt: [52-53];

Wir müssen SGBD anweisen, beim Einfügen einer Zeile in die Tabelle selbst den Primärschlüssel [id] zu generieren:

Image

  • In [56] greifen wir auf die Eigenschaften des Primärschlüssels [id] zu;
  • bei [59] wird angegeben, dass die Spalte vom Typ [Identity] ist. Dies führt dazu, dass SGBD die Werte des Primärschlüssels generiert;

Image

  • in [62] wird der für diesen Vorgang generierte Code SQL angegeben;

Die Tabelle [tbtranches] ist nun fertig.

Wir wiederholen die gleichen Schritte, um die Tabelle [tbconstantes] zu erstellen. Wir geben das zu erzielende Ergebnis an:

Image

Image

Image

Die Datenbank [dbimpots-2019] ist nun bereit. Wir werden sie mit Daten füllen.

Wie bereits bei MySQL möglich, lässt sich die Datenbank [dbimpots-2019] in eine Datei SQL exportieren. Diese Datei SQL kann anschließend importiert werden, um die Datenbank wiederherzustellen, falls sie verloren gegangen oder beschädigt ist. Wir exportieren hier nur die Struktur der Datenbank und nicht ihre Daten:

Image

Image

Die generierte Datei lautet wie folgt:


--
-- PostgreSQL Datenbank-Dump
--

-- Aus der Datenbankversion 11.2 gesichert
-- Ausgespeichert mit pg_dump Version 11.2

-- Gestartet am 04.07.2019 um 08:20:31

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- Eintrag 198 in TOC (Klasse 1259 OID 16408)
-- Name: tbconstantes; Typ: TABLE; Schema: public; Eigentümer: postgres
--

CREATE TABLE public.tbconstantes (
    plafond_qf_demi_part double precision NOT NULL,
    id integer NOT NULL,
    plafond_revenus_celibataire_pour_reduction double precision NOT NULL,
    plafond_revenus_couple_pour_reduction double precision NOT NULL,
    valeur_reduc_demi_part double precision NOT NULL,
    plafond_decote_celibataire double precision NOT NULL,
    plafond_decote_couple double precision NOT NULL,
    plafond_impot_celibataire_pour_decote double precision NOT NULL,
    plafond_impot_couple_pour_decote double precision NOT NULL,
    abattement_dix_pourcent_max double precision NOT NULL,
    abattement_dix_pourcent_min double precision NOT NULL
);


ALTER TABLE public.tbconstantes OWNER TO postgres;

--
-- TOC Eintrag 199 (Klasse 1259 OID 16411)
-- Name: tbconstantes_id_seq; Typ: SEQUENCE; Schema: public; Eigentümer: postgres
--

ALTER TABLE public.tbconstantes ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY (
    SEQUENCE NAME public.tbconstantes_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1
);


--
-- Eintrag 196 in TOC (Klasse 1259 OID 16399)
-- Name: tbtranches; Typ: TABLE; Schema: public; Eigentümer: admimpots
--

CREATE TABLE public.tbtranches (
    limites double precision NOT NULL,
    id integer NOT NULL,
    coeffr double precision NOT NULL,
    coeffn double precision NOT NULL
);


ALTER TABLE public.tbtranches OWNER TO admimpots;

--
-- TOC Eintrag 197 (Klasse 1259 OID 16404)
-- Name: tbimpots_id_seq; Typ: SEQUENCE; Schema: public; Eigentümer: admimpots
--

ALTER TABLE public.tbtranches ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY (
    SEQUENCE NAME public.tbimpots_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1
);


--
-- Eintrag 2694 in TOC (Klasse 2606 OID 16429)
-- Name: tbconstantes tbconstantes_pkey; Typ: CONSTRAINT; Schema: public; Eigentümer: postgres
--

ALTER TABLE ONLY public.tbconstantes
    ADD CONSTRAINT tbconstantes_pkey PRIMARY KEY (id);


--
-- TOC Eintrag 2692 (Klasse 2606 OID 16403)
-- Name: tbtranches tbimpots_pkey; Typ: CONSTRAINT; Schema: public; Eigentümer: admimpots
--

ALTER TABLE ONLY public.tbtranches
    ADD CONSTRAINT tbimpots_pkey PRIMARY KEY (id);


--
-- Eintrag 2821 in TOC (Klasse 0 OID 0)
-- Abhängigkeiten: 198
-- Name: TABLE tbconstantes; Typ: ACL; Schema: public; Eigentümer: postgres
--

GRANT ALL ON TABLE public.tbconstantes TO admimpots;


-- Abgeschlossen am 04.07.2019 um 08:20:32

--
-- Datenbank-Dump „PostgreSQL“ abgeschlossen
--

14.4. Befüllung der Tabelle [tbtranches]

Diese Arbeit haben wir bereits mit den Dateien SGBD und MySQL im Abschnitt „Link“ durchgeführt. Wir müssen lediglich die Datei [database.json] ändern, die die Datenbank beschreibt:

Image

Die Datei [database.json] sieht nun wie folgt aus:


{
    "dsn": "pgsql:host=localhost;dbname=dbimpots-2019",
    "id": "admimpots",
    "pwd": "mdpimpots",
    "tableTranches": "public.tbtranches",
    "colLimites": "limites",
    "colCoeffR": "coeffr",
    "colCoeffN": "coeffn",
    "tableConstantes": "public.tbconstantes",
    "colPlafondQfDemiPart": "plafond_qf_demi_part",
    "colPlafondRevenusCelibatairePourReduction": "plafond_revenus_celibataire_pour_reduction",
    "colPlafondRevenusCouplePourReduction": "plafond_revenus_couple_pour_reduction",
    "colValeurReducDemiPart": "valeur_reduc_demi_part",
    "colPlafondDecoteCelibataire": "plafond_decote_celibataire",
    "colPlafondDecoteCouple": "plafond_decote_couple",
    "colPlafondImpotCelibatairePourDecote": "plafond_impot_celibataire_pour_decote",
    "colPlafondImpotCouplePourDecote": "plafond_impot_couple_pour_decote",
    "colAbattementDixPourcentMax": "abattement_dix_pourcent_max",
    "colAbattementDixPourcentMin": "abattement_dix_pourcent_min"
}
  • Zeile 2: Die Datei „DSN“ hat sich geändert; „[pgsql]“ gibt an, dass es sich um die Postgres-Datei „SGBD“ handelt;
  • Zeilen 5 und 9: Den Namen der Tabellen wurde der Name des Schemas vorangestellt, zu dem sie gehören: [public]. Dies war nicht unbedingt erforderlich, da [public] das standardmäßig verwendete Schema ist, wenn im Tabellennamen kein Schema angegeben ist;
  • Zeilen 6–8, 10–19: Die Spaltennamen wurden geändert;

Das Skript [MainTransferAdminDataFromJsonFile2PostgresDatabase.php] zum Befüllen der Datenbank [dbimpots-2019] lautet wie folgt:


<?php

// Strikte Einhaltung der deklarierten Typen der Funktionsparameter
declare (strict_types=1);

// Namensraum
namespace Application;

// Fehlerbehandlung durch PHP
// ini_set("display_errors", "0");
// Einbindung von Schnittstellen und Klassen
require_once __DIR__ . "/../../version-05/Entities/BaseEntity.php";
require_once __DIR__ . "/../../version-05/Entities/TaxAdminData.php";
require_once __DIR__ . "/../../version-05/Entities/TaxPayerData.php";
require_once __DIR__ . "/../../version-05/Entities/Database.php";
require_once __DIR__ . "/../../version-05/Entities/ExceptionImpots.php";
require_once __DIR__ . "/../../version-05/Utilities/Utilitaires.php";
require_once __DIR__ . "/../../version-05/Dao/InterfaceDao.php";
require_once __DIR__ . "/../../version-05/Dao/TraitDao.php";
require_once __DIR__ . "/../../version-05/Dao/InterfaceDao4TransferAdminData2Database.php";
require_once __DIR__ . "/../../version-05/Dao/DaoTransferAdminDataFromJsonFile2Database.php";
//
// Definition der Konstanten
const DATABASE_CONFIG_FILENAME = "../Data/database.json";
const TAXADMINDATA_FILENAME = "../Data/taxadmindata.json";

//
try {
  // Erstellung der Schicht [dao]
  $dao = new DaoTransferAdminDataFromJsonFile2Database(DATABASE_CONFIG_FILENAME, TAXADMINDATA_FILENAME);
  // Übertragung der Daten in die Datenbank
  $dao->transferAdminData2Database();
} catch (ExceptionImpots $ex) {
  // Der Fehler wird angezeigt
  print "L'erreur suivante s'est produite : " . utf8_encode($ex->getMessage()) . "\n";
}
// Ende
print "Terminé\n";
exit;

Kommentare

Nur die Zeilen 12–21, die die für die Ausführung der Anwendung erforderlichen Dateien laden, ändern sich. Sie ändern sich, weil sich der Wert [__DIR__] ändert: Er verweist nun auf den Ordner [version-07/Main].

Wenn man dieses Skript ausführt, erhält man das folgende Ergebnis in der Tabelle [tbtranches]:

Image

  • Man klickt mit der rechten Maustaste auf [1] und anschließend auf [2-3];
  • in [4] sind die Daten zu den Steuerklassen tatsächlich vorhanden;

Man wiederholt den Vorgang für die Konstantentabelle [tbconstantes]:

Image

Image

Image

Es ist zu beachten, dass für die Ausführung des Skripts die Laragon-Anwendung nicht aktiv sein muss: Weder der Apache-Server noch die Tabellen SGBD und MySQL werden benötigt. Man benötigt lediglich den Dienst SGBD PostgreSQL, dessen Windows-Dienst gestartet wurde.

14.5. Steuerberechnung

Image

Die Ebenen [dao] (3) und [métier] (2) wurden bereits geschrieben. Das Hauptskript für SGBD und MySQL haben wir bereits im Abschnitt „Link“ geschrieben. Wir müssen lediglich das Skript [MainCalculateImpotsWithTaxAdminDataInMySQLDatabase.php] übernehmen und es an die Dateien SGBD und PostgreSQL anpassen. Es heißt nun [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase.php]:

Image

Das Skript [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase.php] lautet wie folgt:


<?php

// Strikte Einhaltung der deklarierten Typen der Funktionsparameter
declare (strict_types=1);

// Namensraum
namespace Application;

// Fehlerbehandlung durch PHP
//ini_set("display_errors", "0");
// Einbindung von Schnittstellen und Klassen
require_once __DIR__ . "/../../version-05/Entities/BaseEntity.php";
require_once __DIR__ . "/../../version-05/Entities/TaxAdminData.php";
require_once __DIR__ . "/../../version-05/Entities/TaxPayerData.php";
require_once __DIR__ . "/../../version-05/Entities/Database.php";
require_once __DIR__ . "/../../version-05/Entities/ExceptionImpots.php";
require_once __DIR__ . "/../../version-05/Utilities/Utilitaires.php";
require_once __DIR__ . "/../../version-05/Dao/InterfaceDao.php";
require_once __DIR__ . "/../../version-05/Dao/TraitDao.php";
require_once __DIR__ . "/../../version-05/Dao/DaoImpotsWithTaxAdminDataInDatabase.php";
require_once __DIR__ . "/../../version-05/Métier/InterfaceMetier.php";
require_once __DIR__ . "/../../version-05/Métier/Metier.php";
//
// Definition der Konstanten
const DATABASE_CONFIG_FILENAME = "../Data/database.json";
const TAXADMINDATA_FILENAME = "../Data/taxadmindata.json";
const RESULTS_FILENAME = "../Data/resultats.json";
const ERRORS_FILENAME = "../Data/errors.json";
const TAXPAYERSDATA_FILENAME = "../Data/taxpayersdata.json";

try {
  // Erstellung der Schicht [dao]
  $dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
  // Erstellung der Schicht [métier]
  $métier = new Metier($dao);
  // Steuerberechnung im Batch-Modus
  $métier->executeBatchImpots(TAXPAYERSDATA_FILENAME, RESULTS_FILENAME, ERRORS_FILENAME);
} catch (ExceptionImpots $ex) {
  // Fehler wird angezeigt
  print "Une erreur s'est produite : " . utf8_encode($ex->getMessage()) . "\n";
}
// Ende
print "Terminé\n";
exit;

Anmerkungen

Nur die Zeilen 12–22, die die für die Ausführung der Anwendung erforderlichen Dateien laden, ändern sich. Sie ändern sich, weil sich der Wert [__DIR__] ändert: Er verweist nun auf den Ordner [version-07/Main].

Ausführungsergebnisse

Die gleichen wie in den vorherigen Versionen.

14.6. Tests [Codeception]

Wie bei den vorherigen Versionen validieren wir diese Version mit den Tests [Codeception]:

Image

14.6.1. Test der Schicht [dao]

Der Test [DaoTest.php] lautet wie folgt:


<?php

// Strikte Einhaltung der deklarierten Typen der Funktionsparameter
declare (strict_types=1);

// Namensraum
namespace Application;

// Stammverzeichnisse
define("ROOT", "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-06");
define("VENDOR", "C:/myprograms/laragon-lite/www/vendor");

// Einbindung von Schnittstellen und Klassen
require_once ROOT . "/../version-05/Entities/BaseEntity.php";
require_once ROOT . "/../version-05/Entities/TaxAdminData.php";
require_once ROOT . "/../version-05/Entities/TaxPayerData.php";
require_once ROOT . "/../version-05/Entities/Database.php";
require_once ROOT . "/../version-05/Entities/ExceptionImpots.php";
require_once ROOT . "/../version-05/Utilities/Utilitaires.php";
require_once ROOT . "/../version-05/Dao/InterfaceDao.php";
require_once ROOT . "/../version-05/Dao/TraitDao.php";
require_once ROOT . "/../version-05/Dao/DaoImpotsWithTaxAdminDataInDatabase.php";

// Bibliotheken von Drittanbietern
require_once VENDOR . "/autoload.php";

// Definition von Konstanten
const DATABASE_CONFIG_FILENAME = ROOT ."../Data/database.json";

class DaoTest extends \Codeception\Test\Unit {
  // TaxAdminData
  private $taxAdminData;

  public function __construct() {
    parent::__construct();
    // Erstellung der Schicht [dao]
    $dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
    $this->taxAdminData = $dao->getTaxAdminData();
  }

  // Tests
  public function testTaxAdminData() {

  }

}

Anmerkungen

  • Zeilen 9–28: Definition der Testumgebung. Wir verwenden dieselbe Umgebung wie im Hauptskript [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase] (siehe Link im Absatz), jedoch ohne die Schicht [métier];
  • Zeilen 34–39: Aufbau der Ebene [dao];
  • Zeile 38: Das Attribut [$this→taxAdminData] enthält die zu testenden Daten;
  • Zeilen 42–44: Die Methode [testTaxAdminData] ist die im Abschnitt „Link“ beschriebene;

Die Testergebnisse lauten wie folgt:

Image

14.6.2. Test der Schicht [métier]

Der Test [MetierTest.php] lautet wie folgt:


<?php

// Strikte Einhaltung der deklarierten Typen der Funktionsparameter
declare (strict_types=1);

// Namensraum
namespace Application;

// Stammverzeichnisse
define("ROOT", "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-06");
define("VENDOR", "C:/myprograms/laragon-lite/www/vendor");

// Einbindung von Schnittstellen und Klassen
require_once ROOT . "/../version-05/Entities/BaseEntity.php";
require_once ROOT . "/../version-05/Entities/TaxAdminData.php";
require_once ROOT . "/../version-05/Entities/TaxPayerData.php";
require_once ROOT . "/../version-05/Entities/Database.php";
require_once ROOT . "/../version-05/Entities/ExceptionImpots.php";
require_once ROOT . "/../version-05/Utilities/Utilitaires.php";
require_once ROOT . "/../version-05/Dao/InterfaceDao.php";
require_once ROOT . "/../version-05/Dao/TraitDao.php";
require_once ROOT . "/../version-05/Dao/DaoImpotsWithTaxAdminDataInDatabase.php";
require_once ROOT . "/../version-05/Métier/InterfaceMetier.php";
require_once ROOT . "/../version-05/Métier/Metier.php";
// Bibliotheken von Drittanbietern
require_once VENDOR . "/autoload.php";
// Definition von Konstanten
const DATABASE_CONFIG_FILENAME = ROOT . "../Data/database.json";

class MetierTest extends \Codeception\Test\Unit {
  // Geschäftslogikschicht
  private $métier;

  public function __construct() {
    parent::__construct();
    // Erstellung der Schicht [dao]
    $dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
    // Erstellung der Ebene [métier]
    $this->métier = new Metier($dao);
  }

  // Tests
  public function test1() {

  }
--------------------------------------------------------------------
  public function test11() {

  }

}

Anmerkungen

  • Zeilen 9–28: Definition der Testumgebung. Wir verwenden dieselbe wie im Hauptskript [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase], das im Abschnitt „Link“ beschrieben ist;
  • Zeilen 34–40: Erstellung der Ebenen [dao] und [métier];
  • Zeile 39: Das Attribut [$this→métier] verweist auf die Ebene [métier]
  • Zeilen 43–49: Die Methoden [test1, test2…, test11] sind die im Abschnitt „Link“ beschriebenen;

Die Testergebnisse lauten wie folgt:

Image