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