Re: [rfc] str_mask function
| From: | سپهر محمودی | Date: | Mon, 21 Sep 2026 13:36:33 +0000 |
| Subject: | Re: [rfc] str_mask function | ||
| References: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-132576@lists.php.net to get a copy of this message | ||
در تاریخ دوشنبه ۲۱ سپتامبر ۲۰۲۶، ۱۶:۴۰ David Maye
<david.maye@seigisoft.com>
نوشت:
> Okay I have another question about the RFC in order to understand it's
> well.
>
> There is no need to use string repeat function at all. If I want five
> hashtags, I can just do "#####", and everything is done 👍.
>
> Because I think people would add the str_repeat function if the data to
> mask has a very Dynamic length. But if we're talking about phone numbers,
> credit cards, they all have the same predefined length in the entire world
> (in the case of phone numbers, some uses 10 digits instead of nine. But
> even this can be fixed pretty easily without additional temporary send
> string).
>
> So if you do just like that, you are completely avoiding the use of
> intermediate zend string allocation. Just by replacing an operation with
> the correct mask, you get exactly the same result we've all needing to
> create a new global function. And (if I'm not wrong), if you want to
> implement a function called string mask, you can configure it in such way
> that it calls substring replace function without an additional Zend string
> allocation.
>
> And thinking about Cake PHP: if they use the kind of pattern that this RFC
> that tries to avoid, which is the use of intermediate zend string
> allocation just for a temporal buffer, then a pull request for that
> function optimization can be done following that kind of pattern (no string
> repeat needed)
>
> Because I think there is no need of very rigorous kind of testing just to
> check if some data will leak. No need to have that kind of safeguards
> prevents developers from "shooting on their foot" like in the case of
> developing in a language like C, just for masking that a a string.
>
> So my question is: you should use the correct string mask, with predefined
> set of characters, inside the substring replace function, then you don't
> need to string mask function right? Because the performance is nearly the
> same?
>
> Awesome a 30ms difference for this kind of operation that appears not very
> often, is it worth it? Considering the use of unnecessary string repeat?
> What the benchmark shows if you just don't use string replace?
>
> Kind regards,
> David Maye.
>
--------
Hi David,
Thank you for bringing this up. It's a great question, and I appreciate the
perspective.
While it is technically possible to achieve masking using a combination of
str_repeat and substr_replace, I believe there are a few reasons why a
dedicated str_mask function is valuable for the PHP core:
1. Performance and Intermediate Allocations: Regarding the performance
difference: I’ve conducted some benchmarks comparing manual user-land
implementations versus the overhead of these operations. You can find the
data here:
https://gist.github.com/sepehrphpr/86c4be78a3f4882dbd58f6598bb92b16.
While a single call might seem negligible, string immutability in PHP means
manual masking forces multiple intermediate zend string allocations and
creates unnecessary pressure on the Garbage Collector. In high-throughput
applications processing millions of strings (e.g., sanitizing logs, PII, or
large database result sets), these hidden overheads accumulate rapidly. A
C-level implementation bypasses this entirely.
2. Code Clarity and Maintainability: Real-world data is rarely static
(e.g., variable-length emails, different phone number formats, or varying
credit card lengths). Developers currently have to calculate lengths,
handle offsets, and manage concatenation manually. str_mask encapsulates
this logic into a single, clean, and expressive call, significantly
reducing the surface area for "off-by-one" or logic errors.
3. "Pit of Success": PHP’s philosophy often leans towards providing tools
that guide developers toward the "pit of success." Providing a native,
optimized, and safe function ensures that developers are using a
standardized implementation, rather than relying on inconsistent
framework-level helpers or fragile custom code.
I’m aiming for this to be a "low-effort, high-impact" utility that prevents
reinventing the wheel in every project.
Best regards,
Sepehr
>
>
>
>