As of right now, three new string functions have been included in the PHP 8. While these three functions do not introduce anything existing built-in functions can’t already accomplish, they are more intuitive.

Functions

str_contains ( string $haystack , string $needle ) : bool

The str_contains function allows you to check if one string is contained within another string. For example:

php > var_dump(str_contains("abc", "b"));
bool(true)

php > var_dump(str_contains("abc", "z"));
bool(false)

Historically, this could be accomplished using the strpos function. strpos will return the position of the first occurrence of the string otherwise it will return FALSE if the string is not contained.

php > var_dump(strpos("abc", "b") !== false);
bool(true)

php > var_dump(strpos("abc", "z") !== false);
bool(false)

The trouble with the existing solutions is that it requires strict comparison which is frequently overlooked. In our example above, strpos would return 0 for a since it’s at position 0 in the string. Without using a strict comparison, the expression would evaluate to false which is clearly not the case.

php > var_dump(strpos("abc", "a") != false);
bool(false)

str_starts_with ( string $haystack , string $needle ) : bool

The str_starts_with function allows you to check if a string begins with another string.

php > var_dump(str_starts_with("abc", "ab"));
bool(true)

php > var_dump(str_starts_with("abc", "xy"));
bool(false)

While str_starts_with too, can be implemented using existing userland functions, the new functions definitely provides a better user experience as its’ intention is more clear.

php > $haystack = "abc";
php > $prefix = "ab";
php > var_dump(substr($haystack, 0, strlen($prefix)) == $prefix);
bool(true)

php > $prefix = "xy";
php > var_dump(substr($haystack, 0, strlen($prefix)) == $prefix);
bool(false)

str_ends_with ( string $haystack , string $needle ) : bool

Similar to str_starts_with, str_ends_with allows you to check if one string ends with another.

php > var_dump(str_ends_with("abc", "bc"));
bool(true)
php > var_dump(str_ends_with("abc", "yz"));
bool(false)

This function can also be implemented similar to str_starts_with using userland functions:

php > $haystack = "abc";
php > $suffix = "bc";
php > var_dump(substr($haystack, -strlen($suffix)) == $suffix);
bool(true)

php > $suffix = "yz";
php > var_dump(substr($haystack, -strlen($suffix)) == $suffix);
bool(false)

What about multibyte strings?

Currently, there are no plans to introduce multibyte versions of these functions. The rationale is that multibyte string functions are for the most part, only needed when dealing with string lengths and offsets. It is expected the new string functions will behave exactly the same with or without multibyte strings.

When can I start using these new string functions?

PHP 8 is scheduled to be released on December 3, 2020. However, using the polyfills below, you can start using them today!

if(!function_exists('str_contains')) {
    function str_contains($haystack, $needle) {
        return strpos($haystack, $needle) !== false;
    }
}

if(!function_exists('str_starts_with')) {
    function str_starts_with($haystack, $needle) {
        return substr($haystack, 0, strlen($needle)) === $needle;
    }
}

if(!function_exists('str_ends_with')) {
    function str_ends_with( $haystack, $needle) {
        return substr($haystack, -strlen($needle)) === $needle;
    }
}

Sources