I don’t think it needs to be added to the enum, necessarily. Just make it a nullable argument to base64_decode.
function base64_decode(string $string, bool $strict = false, ?DecodingMode = null): string|false
That would leave the default behavior of the function intact, but also allows switching it over to either of the new modes (which would then just defer to the new implementations). And we wouldn’t need to deal with “disallowed” modes on the new functions.
Hi Larry,
The goal is not to change the signature of the existing base64_encode
function, but rather to preserve its current non-strict behavior within the new API. This is intended to ensure a smoother transition from the existing API to the proposed one. Therefore, we shouldn’t alter or retrofit the existing function. Instead, the focus should be on providing a clear migration path for users, which is why the addition of a DecodingMode::Unsafe
case is being proposed.
If I were to follow your suggestion, I would have proposed an alternative signature like this:
base64_encode(string $string, bool|DecodingMode $strict = false);
Where:
Encoding\DecodingMode::Strict
is identical to $strict = true
Encoding\DecodingMode::Unsafe
would be identical to $strict = false
and the current function would then become an alias of
Encoding\base64_decode(string $encoded, decodingMode: Encoding\DecodingMode::Unsafe);
// or
Encoding\base64_decode(string $encoded, decodingMode: Encoding\DecodingMode::Strict);
The caveat is that, in the new API, errors will throw exceptions instead of emitting an E_WARNING
and returning false
. Once the current API is eventually removed, the Encoding\DecodingMode::Unsafe
mode would also be deprecated and removed accordingly. And documentation would rightly highlight the danger of using such settings.
Keep in mind that this is in response to Rowan comment and depending on feedback I may not add the Encoding\DecodingMode::Unsafe
to the proposal. I know I do not represent the majority but I tend to always use strict mode when decoding base64 encoded data and when I forget PHPStan reminds me to do so.
Best regards,
Ignace