Hallo Jörg,
Oder gibts nen anderen Trick, mit dem ich die mühevolle Arbeit vermeiden kann?
Nein, einen anderen Trick gibt es nicht.
Du hast insofern Glück, dass PHP einiges seiner früheren Dummheit abgelegt hat.
Dieser Code wird tatsächlich ausgeführt und mault nicht, dass in der Deklaration von test ein "FOO" vor dem $x steht. Er erkennt die Typdeklaration und ersetzt sie nicht durch die Konstante.
define ("int", "FOO");
function test(int $x, $y) {
return "Das ist $y - $x";
}
echo test(3, int);
Aber ist das lesbar? Hat das Zukunft? NEIN! Da musst Du durch. Strings ohne Anführungszeichen sind ein Erbe aus PHP 4 Zeiten und werfen seit PHP 5.2 eine Notice. Seit PHP 7.2 eine Warnung mit der deutlichen Ankündigung des Errors.
Wenn Du einen Zwangstermin im November hast, kannst Du Dir mit dem define Luft verschaffen. Ich kann aber nicht garantieren, dass der überall das tut, was Du erwartest.
Mit einem guten Editor könntest Du einen projektweiten search&replace über alle Dateien probieren, bei dem Du jeden Treffer von Hand bestätigen musst. Du könntest dann dem Editor sagen, dass er nur das Wort int
mit Rücksicht auf Groß-/Kleinschreibung durch "int"
ersetzen solle. Besser noch wäre eine Konstante J_TYPE_INT (oder wie auch immer deine Konvention für selbstdefinierte Konstanten aussieht), die Du mit define auf "int" festlegst. Denn "int"
ist ein magischer String - und Du merkst gerade, welche Konsequenzen dieser faule Zauber hat.
Ab PHP 8.1 kannst Du statt selbstdefinierter Konstanten auch Enumerationen verwenden. Das ist dann zwar etwas mehr Schreibarbeit, aber dass die Würze der Kürze schnell fad werden kann, merkst Du ebenfalls soeben.
Enums:
<?php
enum Foo {
case Dings;
case Bums;
}
function test(Foo $f) {
echo $f->name;
}
test(Foo::Dings); // Läuft
test("Dings"); // Error
Sowas sind technische Schulden. Das Gemeine an PHP ist, dass etliche Dinge, die früher mal ganz normale Praxis waren, auf einmal zu technischen Schulden wurden. Das liegt unter anderem daran, dass die frühen PHP Versionen schludrig konzipiert waren und man das seit vielen Jahren Schritt für Schritt abbaut.
Technische Schulden muss man irgendwann abtragen. Je mehr man sich damit Zeit lässt, desto teurer wird es. Aber das Problem geht nicht weg. Es sei denn, du bist in der glücklichen Lage, selbst wegzugehen und das Problem einem Nachfolger aufzuhalsen.
Das Auffinden der Probleme wird ggf. durch eine gute Entwicklungsumgebung vereinfacht. Oder du rufst den in PHP eingebauten Linter manuell für alle deine Sourcen auf:
https://www.php.net/manual/en/features.commandline.options.php
Rolf
sumpsi - posui - obstruxi