Rolf B: Regex mal wieder (Parameter in Funktionsaufruf in Anführungszeichen setzen)

Beitrag lesen

Hallo Jörg,

du könntest auch einfach Konstanten definieren.

define("int", "int"); define("string", "string"); ... define("bool", "bool");

Damit wäre die Fehlermeldung weg. Problematisch sehe ich aber, dass Du dann Konstanten definierst, die anderswo Bedeutung haben, z.B. als Typdeklaration:

function foo(string $a, int $b) { ... }

PHP kriegt das zwar auseinander sortiert, aber man weiß ja nicht, was in PHP 8.1 und höher noch kommt. Diese Konstanten sollte man als potenzielle reservierte Worte meiden. Die PHP 8.1 Upgrade Infos sagen dazu nichts, aber PHP 9 wird's bestimmt auch mal geben.

Ich habe ein bisschen gespielt:

$pattern = '/\b(my_function\b\s*\(.*?,\s*)(int|string|float|int_null|int_allow_negative|bool)(\s*\))/m';
$dst = preg_replace_callback($pattern, "replacer", $src);

echo "\n---\nErgebnis:\n$dst\n";

function replacer($matches) {
    $result = $matches[1] . "J_XXX_" . strtoupper($matches[2]) . $matches[3];
    echo $
    return $result;
}

Ich verwende einen Replace-Callback, um den Namen der Konstanten Großbuchstaben umzuwandeln. Das ist guter Brauch in PHP. Du solltest dann per define Konstanten wie J_XXX_INT oder J_XXX_INT_ALLOW_NEGATIVE festlegen und diese verwenden, niemals aber die realen Codewerte. Diese müssen für den Anwender von my_function "geheim" bleiben, und es müssen dann auch keine Strings sein, eine Zahl reicht auch. Für XXX verwende ein Kürzel, das zum Thema passt. J_ steht für ... tada - Jörg 😉. Wenn my_function ein Wertevalidator für Datentypen ist, dann z.B. J_VALIDATE_INT etc.

Statt int_null und int_allow_negative solltest Du im Folgeschritt überlegen, ob man daraus nicht mehr als eine Konstante macht, die addiert werden. Sowas wie bei den E_... Werten für error_reporting

J_XXX_INT kann z.B. 1 sein J_XXX_FLOAT kann 2 sein J_XXX_BOOL kann 3 sein J_XXX_STRING kann 4 sein

Verwende so bspw. die Bits 0 bis 14 für Codenummern und mach bei einer höheren Zweierpotenz weiter:

J_XXX_ALLOW_NULL könnte 32768 sein (Bit 15) J_XXX_ALLOW_NEGATIVE könnte 65536 sein (Bit 16)

Du kannst dann den Parameter (nennen wir ihn $validationRule) in seine Bitfelder zerlegen:

function my_function($wert, $validationRule) {
   $type = $validationRule & 32767;   // 32768 - 1: Bits 0 - 14
   $allowNull = $validationRule & 32768; // Bit 15
   $allowMinus = $validationRule & 65536; // Bit 16
   ...
}

Der Aufruf könnte dann so aussehen:

my_function($someValue, J_XXX_INT | J_XXX_ALLOW_NULL);

Diesen Schritt kannst Du mit dem Editor lösen - Dateiübergreifender Search & Replace von J_XXX_INT_NULL auf J_XXX_INT | J_XXX_ALLOW_NULL.

Hoffe, das half.
Rolf

--
sumpsi - posui - obstruxi