Globale Variablen und prozeduraler Code

Wir haben hier ein stark vereinfachtes Beispiel für eine Legacy-Anwendung, die auf PHP 4 zurückgehen könnte. Damals war PHP eine prozedurale Skriptsprache, die für die Erstellung großer und komplexer Anwendungen gar nicht gedacht geschweige denn konzipiert war.

Das hat aber im Zuge des Dotcom-Booms viele kreative Menschen nicht davon abgehalten, mit PHP durchaus komplexe Software zu schaffen. Beispiele hierfür sind bekannte Content-Management-Systeme wie Drupal, TYPO3, Joomla oder Wordpress. Gerade Wordpress hat heute noch mit seiner prozeduralen Geschichte zu kämpfen.

Eine solche Legacy-Anwendung bestand oft aus eine Sammlung von PHP-Skripten, die sich nach Bedarf gegenseitig aufriefen. Objekte wurden von PHP 4 nur sehr leidlich unterstützt, Autoload ist erst in PHP 5 eingeführt worden.

Es war damals üblich, dass die Skripte direkt Ausgabe erzeugten, schliesslich war PHP ursprünglich dafür gedacht, direkt in HTML-Code eingebettet zu werden. Genauso üblich war es, sich auf globale Variablen zu verlassen.

Unser Beispielprogramm besteht aus zwei Skripten. Die eine definiert globale Variablen und ruft das zweite Skript auf, das diese Variablen verarbeitet und das Ergebnis direkt ausgibt. Für unser Beispiel haben wir eine einfache Addition gewählt, um mit einem möglichst einfachen Beispiel zu zeigen, dass die globalen Variablen irgendwie verarbeitet werden.

Hier definieren wir die globalen Variablen

<?php declare(strict_types=1);

namespace spriebsch\tfd\softwareModernisation\branchByAbstraction\encapsulateLegacyPages\proceduralCode;

$a = 1;
$b = 2;

require __DIR__ . '/calculator.php';
example.php

und hier werden diese verarbeitet:

<?php declare(strict_types=1);

namespace spriebsch\tfd\softwareModernisation\branchByAbstraction\encapsulateLegacyPages\proceduralCode;

print $a + $b;
calculator.php

Entgegen unserer sonstigen Gewohnheiten haben beiden Dateien kein declare(strict_types);. Es handelt sich hier schließlich um (simulierten) Legacy-Code!

Wenn wir example.php ausführen, dann sehen wir wie erwartet das Ergebnis

3
Ausgabe von example.php
example.php ausführen

Wir sollten uns nicht von der Einfachheit dieses Beispiels täuschen lassen. Wenn wir deutlich mehr globale Variablen verwenden und komplexes Markup erzeugen würden, wäre das Prinzip immer noch exakt das gleiche.

Jetzt können wir Branch by Abstraction anwenden