Llamada a la función indefinida str_contains() php

2 minutos de lectura

Mi código funciona en localhost a través de APACHE, pero cuando alojé un sitio web con todos los mismos archivos y código, recibo este mensaje:
Error fatal: Llamada a la función no definida str_contains() en /almacenamiento/ssd3/524/16325524/public_html/static/header.php en línea 55

Código PHP donde se muestra el error:

<?php
                            $menu = getAllData('meni');
                            global $korisnik;
                            for ($i = 0; $i < count($menu); $i++){
                                if(isset($_SESSION['korisnik'])){
                                    if(str_contains($menu[$i]->naziv, 'login') || str_contains($menu[$i]->naziv, 'reg')){
                                        continue;
                                    }
                                    echo  '<li><a href="https://stackoverflow.com/questions/66519169/.$menu[$i]->putanja.">'.$menu[$i]->naziv.'</a></li>';
                                }
                                else {
                                    if (str_contains($menu[$i]->naziv, 'profile') || str_contains($menu[$i]->naziv, 'out')) {
                                        continue;
                                    }
                                    echo '<li><a href=" . $menu[$i]->putanja . ">' . $menu[$i]->naziv . '</a></li>';
                                }
                            }
                            ?>

  • @BeshambherChaukhwan—Aunque no veo cómo el problema original es relevante aquí, enlace a ese en lugar de a ese sitio de spam.

    – Julia

    7 de marzo de 2021 a las 17:16


str_contiene() se introdujo en PHP 8 y ​​no es compatible con versiones anteriores.

Para versiones inferiores de PHP, puede usar una solución alternativa con strpos():

if (strpos($haystack, $needle) !== false) {
  // haystack contains needle
}

avatar de usuario de rjdown
rjdown

El página de manual para str_contains dice que la función se introdujo en PHP 8. Sospecho que su host está en PHP 7 (o posiblemente inferior).

Puede definir un polyfill para versiones anteriores (adaptado de https://github.com/symfony/polyfill-php80)

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

los documentos decir str_contains fue introducido en PHP 8.0.

Probé la respuesta de rjdown y funcionó, pero agregué una forma de devolver falso en caso de que algunos de los argumentos no sean cadenas:

if (!function_exists('str_contains')) {
    function str_contains($haystack, $needle): bool {
        if ( is_string($haystack) && is_string($needle) ) {
            return '' === $needle || false !== strpos($haystack, $needle);
        } else {
            return false;
        }
    }
}

Ver módulos Apache habilitados

sudo apachectl -M

Deshabilitar 7.4 módulos

sudo a2dismod php7.*

Habilitar php8

sudo a2enmod php8.1

Avatar de usuario de Dorzestiru
Dorzestiru

Usa este código:

if (!function_exists('str_contains')) {
    function str_contains($haystack, $needle): bool {
        if ( is_string($haystack) && is_string($needle) ) {
            return '' === $needle || false !== strpos($haystack, $needle);
        } else {
            return false;
        }
    }
}

¿Ha sido útil esta solución?