Bahnhofstraße 22, 52134 Herzogenrath Montag - Freitag: 8:00 - 16:30 kontakt@milnersoftware.de 0176 66798849

Aktuelles · PHP · · 3 Min. Lesezeit

„count(): Argument must be of type Countable|array“: Fehler nach PHP 8 beheben

Unter PHP 7 nur eine Warnung, seit PHP 8 ein Absturz: count() auf null oder einen Text. Warum dieser Fehler nach PHP-Updates so häufig ist und wie Sie ihn sauber beheben.

Schreibtisch mit Laptop, Notizbuch und Kaffeetasse

Kurz gesagt: Seit PHP 8.0 bricht count() mit einem Fehler ab, wenn es keinen Array und kein zählbares Objekt bekommt, sondern zum Beispiel null oder einen Text. Unter PHP 7.2 bis 7.4 gab es dafür nur eine Warnung, darum fällt der Fehler oft erst nach dem PHP-Update auf. Die Lösung ist, vor dem Zählen sicherzustellen, dass ein Array ankommt: mit ?? [] oder einer Prüfung mit is_countable().

Fatal error: Uncaught TypeError: count(): Argument #1 ($value) must be of type
Countable|array, null given in /var/www/html/inc/warenkorb.php:41

Anders als bei vielen anderen Meldungen nach einem PHP-Update ist das kein Hinweis, sondern ein Abbruch. Die Seite zeigt eine weiße Fläche, einen Error 500 oder in WordPress „Es gab einen kritischen Fehler“.

Warum der Fehler so häufig ist

Älterer PHP-Code hat sich oft darauf verlassen, dass count(null) einfach 0 ergibt. Das war bequem: Eine Liste, die gar nicht geladen wurde, galt als leer. PHP 7.2 hat dafür eine Warnung eingeführt, PHP 8.0 einen echten Fehler. Wer direkt von PHP 7.0 oder 7.1 auf PHP 8 springt, bekommt die Fehler alle auf einmal.

Typische Stellen

  • Eine Datenbankabfrage oder Funktion liefert null oder false statt einer leeren Liste.
  • Ein Formularfeld mit Mehrfachauswahl wurde nicht ausgefüllt und fehlt daher in $_POST.
  • Eine Variable wird nur in einem if-Zweig als Array angelegt.
  • Gezählt wird ein Text, zum Beispiel ein Wert, der aus der Datenbank als Zeichenkette kommt. Dafür ist strlen() da, nicht count().

So beheben Sie es

Leeres Array als Standard

// vorher
if (count($produkte) > 0) { … }

// nachher
if (count($produkte ?? []) > 0) { … }

Prüfen mit is_countable()

$anzahl = is_countable($produkte) ? count($produkte) : 0;

is_countable() gibt es seit PHP 7.3. Es ist die richtige Wahl, wenn ein Wert mal ein Array, mal etwas anderes sein kann.

An der Quelle beheben

Am saubersten ist es, wenn Funktionen, die Listen liefern, immer einen Array zurückgeben, notfalls einen leeren. Dann muss nicht jede Stelle, die zählt, selbst aufpassen.

function ladeProdukte(Datenbank $db, int $kategorie): array
{
    $liste = $db->holeProdukte($kategorie);
    return $liste ?: [];
}

Die Typangabe : array sorgt außerdem dafür, dass PHP sofort meldet, wenn die Funktion doch einmal etwas anderes zurückgeben will.

Leere Prüfung ohne count()

Oft wird count() nur benutzt, um zu prüfen, ob überhaupt etwas da ist. Dafür reicht !empty($produkte). Es funktioniert mit Arrays, null und fehlenden Variablen und wirft keinen Fehler. Ausnahme: Bei zählbaren Objekten wie Collections liefert empty() auch dann false, wenn sie leer sind.

In WordPress und anderen Systemen

Stammt der Fehler aus einem Plugin oder Theme, ist es meist eine veraltete Version. Zuerst aktualisieren. Gibt es kein Update mehr, muss das Plugin ersetzt oder der Code angepasst werden. Wie Sie eine WordPress-Seite sicher auf neues PHP bringen, steht in WordPress auf eine neue PHP-Version umstellen.

Professionelle Hilfe

Ich bringe ältere PHP-Anwendungen auf PHP 8 und behebe solche Fehler an der Quelle, nicht nur an der Stelle, an der sie gerade auffallen. Mehr unter PHP-Fehler beheben und Altsystem modernisieren.

Geschrieben von Przemysław Milner

Weitere Beiträge