Programmierung für Clinical Data Management
Ich glaube, ich darf mich Dozent nennen, denn ich habe heute den ersten von zehn ganztägigen Workshops zum Thema Programmierung im Rahmen der Weiterbildung Clinical Data Management gegeben. Und das hat mal richtig Spaß gemacht!
Die Weiterbildung ist Teil des Angebotes der mibeg Institute, deren Mitarbeiterinnen mir einen wunderbaren Start bereitet haben: Begehung der Räumlichkeiten vor Ort, VPN, Remote-Zugriff auf ihre PCs, Online-Lernplattform und Videotelefonie via BigBlueButton. Alles da!
Ich darf vier aktive und begabte Teilnehmerinnen in PHP, JavaScript und etwas Objektorientierter Programmierung unterrichten; und zwar ohne endlose Präsentationen und theoretisches Blabla, sondern interaktiv und mit viel Zeit für eigene Experimente. So war zumindest mein Plan und ich bin überglücklich, dass einerseits die Teilnehmerinnen dazu bereit waren und andererseits das von mir ausgewählte Tooling super funktioniert hat.
Eigentlich bin ich seit der zunehmenden Enshittification durch Microsoft nicht mehr viel auf GitHub unterwegs, aber ich muss gestehen, dass GitHub Codespaces genau das Feature ist, das ich gebraucht habe: Konfigurierbare Cloud-Entwicklungsumgebungen mit VS Code im Browser und 120 kostenlosen Nutzungsstunden pro Monat. Ich habe den PHP Codespace aus Lyubomir Filipovs Blog-Post Using GitHub Codespaces for PHP Tutoring benutzt und alles hat auf Anhieb funktioniert: GitHub Repository forken, Codespace auf dem main
Branch starten, PHP-Datei anlegen und im Terminal des im Browser laufenden VS Code Editors ausführen. Die Interaktions-Progression innerhalb der ersten 90 Minuten meines Workshops lief dann ungefähr so ab:
- Ich teile meinen Bildschirm via BigBlueButton und demonstriere einige PHP-Grundlagen im Browser.
- Dank des Live Share Features von VS Code kann ich die Teilnehmerinnen per Link (und ohne dass sie einen GitHub-Account brauchen) zur Kollaboration in meiner VS Code Instanz im Browser einladen. So können sie ihre ersten eigenen Zeilen Code schreiben.
- Die Teilnehmerinnen legen sich ein eigenes GitHub-Konto an, forken mein vorbereitetes PHP Codespace Repository, starten ihren eigenen Codespace und wir können so richtig loslegen.
Nach wenigen Minuten hatten alle ihre eigene Entwicklungsumgebung eingerichtet und arbeiteten an den ersten Übungen. Wenn du ein ähnliches Angebot kennst, das nicht so schwer auf dem Karma-Konto lastet, wie die Lösung von GitHub… immer her damit!
Im Folgenden dokumentiere ich stichpunktartig den durchgenommenen Stoff.
Session 01: Grundlagen von PHP
- PHP ist eine interpretierte Skript-Sprache, das heißt
*.php
Dateien können von der PHP engine direkt und ohne Kompilierung ausgeführt werden. Folgende Kommandozeilenbefehle sind dabei hilfreich:php index.php
führt die Dateiindex.php
ausphp -a
startet PHP im interaktiven Modus; praktisch für schnelle Experimentephp -a -d auto_prepend_file=index.php
startet PHP im interaktiven Modus und lädt die Dateiindex.php
; Variablen und Funktionen aus der Dateiindex.php
können so im interaktiven Modus genutzt werdenphp -s 0.0.0.0:8080 -t public
startet den von PHP mitgelieferten Server auf0.0.0.0:8080
und liefert Dateien im Ordnerpublic
aus
- PHP-Code muss zwischen
<?php … ?>
eingebettet werden, wobei das schließende?>
weggelassen werden kann, wenn eine Datei ausschließlich PHP-Code—und nicht auch beispielsweise HTML-Code—enthält - Code kann mit
//
(einzeilig) und/* … */
(mehrzeilig) kommentiert werden - Variablen beginnen mit einem
$
und werden der Konvention nach per$lowerCamelCase
benannt - Konstanten:
define("PI", 3.14);
- Ressourcen
- PHP Manual (offizielle Dokumentation)
- PHP – The Right Way (Sammlung von aktuellen, bewährten Programmier-Methoden und -Paradigmen)
Datentypen
- Skalar:
string
(Text),int
(ganze Zahlen),float
(Gleitkommazahlen),bool
(Wahrheitswertetrue
undfalse
) - Nicht-skalar/zusammengesetzt:
array
- Spezialtypen:
NULL
(Abwesenheit eines Wertes) - Informationen zu Ausdrücken erhalten:
gettype()
odervar_dump()
- Abfrage des Typs mit
is_*
Funktionen, z.B.is_string()
,is_null()
,is_numeric()
(letztere kombiniert die Abfrage nachint
undfloat
) - Hinweis: PHP ist eine Sprache mit langer Historie und kämpft daher mit einigen Inkonsistenzen, z.B.
gettype(3.14)
liefertdouble
als Datentyp - PHP versucht in verschiedenen Kontexten den Typ von Werten zu ändern (implizite Typumwandlung, type juggling), z.B. ist
"1" + 1
ein zulässiger Ausdruck und evaluiert zu dem Integer-Wert2
Strings (Zeichenketten) und von PHP mitgelieferte Funktionen
- String in einzelnen
'…'
(spezielle Ausdrücke wie Escape-Sequenzen oder Variablen werden nicht interpretiert) oder doppelten Anführungszeichen"…"
(Escape-Sequenzen und Variablen werden interpretiert und ersetzt)- Vergleichen Sie zum Beispiel die Ausgabe von
'$test\n'
und"$test\n"
- Vergleichen Sie zum Beispiel die Ausgabe von
- Heredocs/Nowdocs
- PHP bringt diverse String-Funktionen mit; ein Blick in die offizielle Dokumentation lohnt sich vor und während des Programmierens
Übungen
- Schreiben Sie zu einer Variable
$name = "…";
einen Ausdruck, der zu<Name> lernt gerade PHP!
auswertet. - Schreiben Sie einen Ausdruck, der für einen String
$word
prüft, ob es sich dabei um ein Palindrom handelt.
Konditionale
if (…) { … } elseif (…) { … } else { … }
- Alternative Syntax:
if ( … ):
/endif;
- Logische Operatoren:
and
/&&
,or
/||
,not
/!
,xor
(exklusives oder) - Prüfen auf Un-/Gleichheit mit
==
/===
und!=
/!==
, wobei die zweite Version auch Un-/Gleichheit des Typs einschließt switch
/case
/default
, Verlassen eines Code-Blocks mitbreak
match
Anweisung- Ternäroperator
booleanExpression ? valueIfTrue : valueIfFalse
- Null-coalescing Operator
value ?? valueIfNull
Eigene Funktionen schreiben
- Code auf mehrere Dateien aufteilen und diese mit
require_once <file>;
laden - Namenskonvention für Funktionen ist
snake_case
function which_is_smaller(int $n1, int $n2): int {
if ($n1 < $n2) {
return $n1;
}
else {
return $n2;
}
}
- Schlüsselwort
function
, Parameter, Rückgabetyp (Typangaben sind in PHP optional) - Funktionen können auch keinen Rückgabewert haben (kein oder ein leeres
return;
) und haben dann den Rückgabetypvoid
- Seiteneffekte
- Nullable Typen mit einem
?
Präfix und union Typen wie z.B.int|float
- Dabei ist
?string
undstring|null
äquivalent - Spezieller Typ
mixed
- Dabei ist
- Optionale Parameter mit vorgegebenen Werten, z.B.
function greeter(string $name, string $greeting = "Hello") {…}
- Positions- und benannte Attribute, wobei bei der Nennung das
$
der Parametervariable weggelassen wird - Wichtig: Der Standard von PHP für skalare Typen und Arrays ist pass-by-value und nicht pass-by-reference; pass-by-reference kann mit einem
&
Präfix am Parameter erreicht werden

Übungen
- Setzen Sie die Palindrom-Prüfung von oben als Funktion um.
- Erweitern Sie die Funktion
which_is_smaller
von oben derart, dass Argumente sowohl vom Typint
als auchfloat
akzeptiert werden und der Rückgabewert bei Gleichheit der ArgumenteNULL
ist. - Implementieren Sie eine Funktion
is_even_or_odd(int $num): string
, die abhängig davon, ob$num
gerade oder ungerade ist, even oder odd zurückgibt.
Schleifen
- Kopfgesteuert:
while (…) { … }
- Fußgesteuert:
do { … } while (…)
- Zählschleifen:
for ($i = 10; $i >= 0; $i--) { print "$i\n"; }
- Alternative Syntax äquivalent zu
if
- Steuerung mit
break
undcontinue
Übung
- Implementieren Sie eine Funktion
make_tannenbaum(…)
, die ASCII-Tannenbäume ausgeben kann (siehe unten). Wählen Sie ansprechende Parameter, mindestens aber Breite des Baumes, Höhe des Stammes und ASCII-Zeichen für den Baum.
...#...
..###..
.#####.
#######
...#...
...#...