PHP 7.2 Fix count

"Corriger" la fonction count sur des projets legacy

Février 2019

Pour ceux qui veulent migrer de vieux projets en PHP 7.2+, une BC est apparue sur la fonction count (et sizeof du coup)

La nouvelle fonction count ne fonctionne que sur des Countable ou des array.

Avant PHP 7.2, la fonction avait un comportement plutôt bizarre mais bon c'était "historique". Cela a été réglé à juste titre. Le problème c'est le code legacy dans d'énormes projets ou les briques dépendantes legacy du web non compatibles php 7.2.

Exemples d'incohérences précédentes :

  • count(<string>) = 1
  • count(<integer>) = 1
  • count(<boolean>) = 1
  • count(<float>) = 1
  • count(<object>) = 1
  • count(null) = 0

Principe

L'outil est ajouté via composer et se lance en "script" post-autoload-dump de ce dernier.

Php 7.2 fix count parse tous les fichiers php à la recherche d'utilisation de count et sizeof et chaque fois que ces utilisations sont trouvées il génère un "hack" qui override la fonction dans le namespace où elle a été détectée.

Le corrolaire c'est que ça ne fonctionne pas si vous avez utilisé la fonction avec le backslash \count

En pratique je m'en suis servi sur un projet interne qui a plus de 2.5M de lignes de code et 13k fichiers. L'analyse et le fix prennent autour de 20 secondes ce qui est plutôt honorable. J'avais bien sûr de gros besoin de perf et le code a été conçu dans cette optique (optimisation à base de switch, code assez bas niveau, mais 100% testé).

Installation

Dans le composer.json

"require": {
    "arnapou/php72fixcount": "^1.0"
},
"scripts": {
    "post-autoload-dump": [
        "@php vendor/bin/php72-fix-count.php --quiet generate src vendor"
    ]
}

utilisation en direct

PHP 7.2 FIX COUNT

DESCRIPTION
    This command generate php files which are loaded by composer
    in order to fix/hack the breaking change of the count/sizeof
    breaking change for php 7.2+

SYSNOPSIS
    php php72-fix-count.php [OPTION] COMMAND DIRECTORY...

OPTION
    --quiet    silent mode (usefull for composer post-autoload-dump)

COMMAND
    generate   generate the fixes
    search     search the fixes (same as generate but no write)
    clean      remove the fixes

EXAMPLES
    php php72-fix-count.php --quiet generate src vendor
    php php72-fix-count.php clean

Liens

Voir sur GitHub