Thanks! I did not find those, maybe the emails need to be enriched with keywords. Like SEO-aware email authoring.
Ok. I am looking at the RFC and the old discussions at https://marc.info/?l=php-internals&m=147017797404339&w=2 I don't know how to follow up on old threads that I don't have in my email inbox. So here is my feedback. The RFC seems mostly fine as it is. It does not contain anything like the string_clip_suffix() / string_clip_prefix(), but I think these should be discussed separately. About the naming: The "i" in str_ibegin and str_iend() seems ok to me. I also strongly support separate functions instead of a parameter for case sensitivity. I also support the underscore. str_begin() is better than strbegin(). ------------------------ Whether to have an "s" at the end: https://marc.info/?l=php-internals&m=147017797404339&w=2 (Yasuo Ohgaki) > It might be okay to have "s" in function names, but if we want to be > consistent, > str_replace -> str_replaces > str_ireplace -> str_ireplaces I disagree with this analogy. The "s" in str_begins() would be for "haystack beginS with needle". An "s" in str_replaces() would stand for what? Both "begin" and "replace" are verbs, but they have a different role in the function name. "begin" describes a state or condition we want to verfiy, whereas "replace" is a command we give to the machine. So to me it would make sense to have str_begins() and str_ends() instead of str_begin() and str_end(). To me, str_end() means either "End the string!" (command) or "Give me the end of the string!" (noun). In fact Rowan Collins made the same argument here, https://marc.info/?l=php-internals&m=147017844704431&w=2 > I think those names mean something different: "str_begin" sounds like an > imperative "make this string begin with X"; "str_begins" is more of an > assertion "the string begins with X". Ruby would spell it with a ? at > the end. It's also the same form, grammatically, as the common "isFoo". > > Note that this logic holds for "str_replace", which *is* an imperative - > you are not saying "tell me if X replaces Y", you are saying "please > replace X with Y". But then Will talks about consistency again. https://marc.info/?l=php-internals&m=147018700406320&w=2 > I think like > having an "s" at the end of the function names reads better, but > omitting the "s" fits better with the existing function names and does > not read bad. Therefore, I am in favor of dropping the "s". Honestly, looking at the existing string functions at http://php.net/manual/en/ref.strings.php I don't see a lot of consistency here. Just a long list of garbled abbreviations. I also don't see any existing function where the verb has a similar role as the "begin" in str_begin(). For all the existing string functions, the verb is a command. I think a better comparison would be file_exists() function_exists() class_exists() is_subclass_of() extension_loaded() ncurses_has_colors() ncurses_can_change_color() What these functions have in common: - The return value is boolean. - The verb is not a command, but it describes a state or condition. The verb is not always at the end of the function name, and it does not always end with -s. But the form and ending of the verb follows its grammatical role in the sentence. I think this is a much better guideline than following a wrong idea of consistency. ------------------------- Finally, I don't know why everything needs to be abbreviated. Having str_* instead of string_* seems ok to me, and is consistent with existing string functions. But my first idea would have been more complete phrases like str_ends_with, str_has_ending(), str_has_suffix(). Instead of just str_end(), or str_ends(). On the other hand, shorter function names have their benefits. So.. no strong opinion here. -------------- -- Andreas On Tue, Aug 1, 2017 at 8:29 AM, Michał Brzuchalski <mic...@brzuchalski.com> wrote: > Hi Andreas, > > 2017-08-01 6:57 GMT+02:00 Andreas Hennings <andr...@dqxtech.net>: >> >> Hello list, >> a quite common use case is that one needs to find out if a string >> $haystack begins or ends with another string $needle. >> Or in other words, if $needle is a prefix or a suffix of $haystack. >> >> One prominent example would be in PSR-4 or PSR-0 class loaders. >> Maybe the use case also occurs when writing parsers.. >> In each of these two examples (parsers, class loaders), we care about >> performance. >> >> (forgive me if this was discussed before, I did not find it anywhere >> in the archives) >> >> -------------------------- >> >> Existing solutions to this problem feel non-trivial, and/or are >> suboptimal in performance. >> >> https://stackoverflow.com/questions/2790899/how-to-check-if-a-string-starts-with-a-specified-string >> >> https://stackoverflow.com/questions/834303/startswith-and-endswith-functions-in-php >> This answer compares different solutions, >> https://stackoverflow.com/a/7168986/246724 >> >> Existing solutions: >> (Let's focus on string_starts_with(), the other case is mostly >> equivalent / symmetric) >> >> if (0 === strpos($haystack, $needle)) {..} >> I have often seen this presented as the preferable solution. >> Unfortunately, this searches the entire string, not just the >> beginning. Especially if $haystack is really long, this can be a >> waste. >> E.g. if (0 === strpos(file_get_contents('some_source_file.php'), >> '<?php')) {..} will search the entire file for an occurence of >> '<?php'. >> >> if ($needle === substr($haystack, 0, strlen($needle))) {..} >> This reserves new memory for the substring, which later needs to be >> garbage-collected. >> Also, this requires an additional function call to strlen() - which >> adds even more clutter if $needle is an expression, not just a >> variable. >> >> if (0 === strncmp($haystack, $needle, strlen($needle))) {..} >> Needs the additional call to strlen(). >> Otherwise, this seems like a really good solution. >> >> if ('' === $needle || false !== strrpos($haystack, $needle, >> -strlen($haystack))) {..} >> This is the funky solution from >> https://stackoverflow.com/a/10473026/246724 >> The author says that it will be outperformed by strncmp() - so.. >> >> if (preg_match('/^' . preg_quote($needle, '/') . '/', $haystack)) {..} >> Clearly gonna be slower than other options. >> >> As said, all these solutions do work, but they are either suboptimal, >> or they add clutter and overhead, or feel a bit like mind acrobatics. >> >> ----------------- >> >> So, I wonder if it would be worthwhile to add new functions >> string_starts_with() / string_has_prefix(), and string_ends_with() / >> string_has_suffix(). >> >> (Or maybe change strncmp(), so that the 3rd parameter $len is >> optional. If $len is NULL / not provided, it would use the length of >> the second (or first?) string. >> (idea was that second parameter = needle).) >> >> For me personally, I am sure that I would use a new >> string_starts_with() a lot more often than a lot of the other existing >> string functions. >> I don't think it is an exotic or niche use case. >> >> -------------- >> >> Spinning this further: >> A lot of times if I want to check if $haystack begins with $needle, I >> will then need the rest of the string after $needle. >> So >> if (string_starts_with($haystack, $needle)) { >> $suffix = substr($haystack, strlen($needle)); >> } >> or >> if (string_ends_with($filename, '.php')) { >> $basename = substr($filename, 0, -4); >> } >> >> I wonder if this could be somehow combined. >> E.g. >> if (FALSE !== $basename = string_clip_suffix($filename, '.php')) { >> // Do something with $basename. >> } >> >> ------------------ >> >> One flaw of these new functions would be that they are less versatile >> than other string functions. >> They solve this problem, and nothing else. >> On the other hand, this is the point, to avoid unnecessary overhead. >> >> The other problem would be, of course, "feature creep" aka "we have so >> many string functions already". >> This is a matter of opinion. >> I would imagine the "cost" of new native functions is: >> - global namespace pollution >> - increased mental load to learn and remember all of them >> - higher memory footprint of php engine? >> - more C code to maintain >> - a new doc page. >> Did I miss something? >> >> ------------------ >> >> -- Andreas >> >> -- >> PHP Internals - PHP Runtime Development Mailing List >> To unsubscribe, visit: http://www.php.net/unsub.php >> > > This idea was discussed 11 months ago https://externals.io/message/94787 > There is also a proper RFC > https://wiki.php.net/rfc/add_str_begin_and_end_functions > You might wanna contact with Will to get feedback from the idea. > > -- > regards / pozdrawiam, > -- > Michał Brzuchalski > about.me/brzuchal > brzuchalski.com -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php