1
votes

Attention: sizeof (): Le paramètre doit être un tableau ou un objet qui implémente Countable php7.2

J'ai mis à jour vers PHP 7.2 et cela a créé un tableau (sans jeu de mots) de problèmes. Je les ai éliminés (principalement ces avertissements sizeof et count (). La seule erreur que nous avons:

Attention: sizeof (): Le paramètre doit être un tableau ou un objet qui implémente Countable dans /usr/www/domain/phpmyd/includes/class_registry.php en ligne 236

J'ai essayé de le réparer comme ceci:
if (sizeof ($ this-> config)
À ceci:
if (! empty ($ this-> config) && (sizeof ($ this-> config)

Mais cela crée beaucoup plus d'erreurs illustrées ci-dessous, cependant , nous avons corrigé celui-ci de la même manière et cela fonctionne parfaitement. Changer ceci:
if (0 language)) {
À ceci:
if (! empty ($ this-> language) && (0 language))) {

A éliminé fondamentalement la même erreur. Maintenant, gardez à l'esprit que l'avertissement ci-dessus est la SEULE erreur restante. Tout le reste fonctionne parfaitement, cependant, si je "corrige" l'avertissement, j'obtiens un tas d'erreurs qui cassent le site et semblent hors de propos. Donc, si je remplace cette première chaîne, toutes ces erreurs apparaissent:

  • Avertissement: utilisation d'une constante non définie ADDON_DISCOUNT_CODES - supposée 'ADDON_DISCOUNT_CODES' (cela générera une erreur dans une version future of PHP) dans /usr/www/domainlistings/phpmyd/index.php en ligne 6
  • Avertissement: Utilisation d'une constante non définie ADDON_BLOG - supposé 'ADDON_BLOG' (cela lancera une erreur dans une future version de PHP) dans /usr/www/domainlistings/phpmyd/cp/template/default/admin_header.tpl à la ligne 134
  • Avertissement: utilisation de la constante non définie ADDON_LINK_CHECKER - supposée 'ADDON_LINK_CHECKER' (cela générera une erreur dans une future version de PHP) dans /usr/www/domainlistings/phpmyd/cp/template/default/admin_header.tpl à la ligne 179

Ces erreurs ne sont PAS apparues, et ces choses ont parfaitement fonctionné jusqu'à ce que je change if (sizeof ($ this-> config)

Comment est-ce lié? Je ne suis pas sûr de ce qui se passe ici, comment cette ligne peut faire ou défaire ces autres choses (apparemment sans importance). Code complet du problème initial (ligne 236):

/**
     * Get a configuration value
     * @param string $key
     * @return mixed
     */
    public function getConfig($key) {
        if (sizeof($this->config) < 1) {
            $this->loadConfig();
        }
        return isset($this->config[$key]) ? $this->config[$key] : false;
    }

Des idées?


4 commentaires

Juste curieux: pourquoi avez-vous besoin de sizeof / count ici? Quel est le problème avec un simple if (! $ This-> config) ?


OP demandait pourquoi cela ne fonctionnait pas.


C'est un problème courant avec la mise à jour vers 7.2, en particulier avec les modules / packages contrib. À partir de 7.2.0, count émet un avertissement s'il est passé une valeur nulle, il échouait en silence. par exemple. php.net/ manuel / fr /…


@ JDev518 C'est correct, et j'en ai déjà corrigé une douzaine, mais celui-ci semblait avoir des conséquences pour la plupart dissociées, et je ne connaissais pas la cause (ni le lien). Emix m'a fait réfléchir!


3 Réponses :


1
votes

Pour commencer, n'utilisez pas sizeof , mais count ;) amélioration bon marché - toujours un opcode de moins.

Deuxièmement, assurez-vous de transmettre un tableau, pas null ou ce que vous avez là-bas, par exemple :

public function getConfig($key, $default = false)
{
    if (!is_array($this->config)) {
        // make sure it becomes one after the load
        $this->loadConfig();
    }

    return $this->config[$key]) ?? $default;
}

Pour résoudre ce problème correctement, vous ne devez jamais autoriser cette propriété à être null de toute façon. Si vous recherchez un chargement différé, vérifiez si la variable est nulle ou n'est pas un tableau, par exemple:

// dirty fix
if (count((array) $this->config) > 0) {
    …
}


1 commentaires

Donc, vous n'avez pas tort avec la deuxième partie. Cela semble une approche plus valable, bien que si j'implémente une solution comme celle-là, elle jette les mêmes erreurs de configuration et nous expliquons malheureusement pourquoi, je dois vraiment y réfléchir. Le premier correctif arrête l'avertissement et ne rompt pas la configuration. Je suis honnêtement choqué que cela fonctionne comme ça, et nous n'y avons pas pensé. Vos deux réponses sont valables, je l'apprécie! je



2
votes

Je pense que ce qui se passe ici est que le changement que vous avez effectué à l'origine garantit que loadConfig () ne se produira jamais, et que quelque chose dans loadConfig () est responsable de la définition de toutes ces constantes vous êtes averti après avoir modifié cela.

Si vous avez remplacé

if (empty($this->config)) {
    $this->loadConfig();
}

par

if (!empty($this->config) &&(sizeof($this->config) < 1)) {

, si $ this-> config était null (la valeur par défaut d'une propriété d'objet qui n'a pas encore reçu de valeur), alors le second signifierait que la condition if ne serait pas être satisfait car null est vide, où dans le premier, il serait satisfait car sizeof (null) renvoie toujours 0 même s'il donne vous l'avertissement innombrable.

sizeof n'a jamais été vraiment nécessaire là-bas. Vous n’avez pas besoin de compter quelque chose juste pour voir s’il existe.

Je pense que cela devrait très bien fonctionner et avoir plus de sens pour ce qu’il est censé faire.

if (sizeof($this->config) < 1) {


1 commentaires

Merci! Cela a beaucoup de sens, j'apprécie vraiment que vous le décomposiez comme ça. Il y a certainement d'autres points à améliorer, merci!



2
votes

Vous pouvez simplement vérifier, avant de passer la variable, si c'est un tableau ou non:

if(is_array($this->config)){
   if(sizeof($this.config) < 1) {
       // code here
   }
}


0 commentaires