IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Parameter must be an array or an object that implements Countable [PHP 7]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut Parameter must be an array or an object that implements Countable
    Bonsoir,

    j'obtiens le message d'erreur donné dans le titre et je ne parviens pas à l'éliminer...

    livres.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $livres = $livreManager->getLivres();
    for($i=0; $i < count($livres);$i++) : 
    etc

    avec la classe LivreManager :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class LivreManager extends Model implements Countable  {
        private $livres;
        private $count = 0;
     
        public function count() {
            return ++$this->count;
        }
     
        public function getLivres(){
            return $this->livres;
        }
    ...
    Ca me génère
    ( ! ) Warning: count(): Parameter must be an array or an object that implements Countable in C:\projets\dvp\e2\biblio\livres.php on line 2
    Ayant cette erreur, j'ai ajouté à la classe LivreManager le implements Countable et la méthode count() (lignes 5 à 7) mais ça ne suffit pas. Comment faire ?

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 350
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 350
    Billets dans le blog
    17
    Par défaut
    C'est la propriété $livres qui n'implémente pas Countable.

    Pense à l'initialiser.

  3. #3
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut
    Merci, j'ai rajouté l'init de la propriété à la classe LivreManager et je n'ai plus l'erreur :
    private $livres = [];.

    Quel rapport entre l'init de cette propriété et l'implémentation de l'interface, STP ?

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 350
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 350
    Billets dans le blog
    17
    Par défaut
    Tu fais un foreach sur $livres, variable venant de la propriété du même nom de $livresManager.

    Si la propriété n'est pas valorisée c'est comme si tu faisais un foreach sur NULL.

    L'implementation de Countable ne sert à rien ici. Ça pourrait servir si tu faisais count($livresManager)

  5. #5
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut
    Merci pour l'explication.

    C'est pas un foreach mais une boucle for .

    Par contre juste avant la boucle, il y a une init : $livres = $livreManager->getLivres();. Pourquoi ça suffit pas ?

  6. #6
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 350
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 350
    Billets dans le blog
    17
    Par défaut
    Pardon, c'est pas le foreach qui pose problème mais le count sur un élément non initialisé / non tableau

    ::getLivres retourne la propriété ::$livres, si $livres n'est pas Countable ça bloque, un tableau est Countable

  7. #7
    Membre émérite Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Par défaut
    Intuitant que $livres est un tableau de livres
    Ligne 6 de la déclaration de classe :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    return count($this->livres);

  8. #8
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut
    Merci ; ici, ça fonctionne car justement, le seul endroit où on utilise count porte sur $this->livres mais si on voulait utiliser count sur une autre propriété ?

  9. #9
    Membre émérite Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    Merci ; ici, ça fonctionne car justement, le seul endroit où on utilise count porte sur $this->livres mais si on voulait utiliser count sur une autre propriété ?
    Tu pourrais mais, à mon sens, ça n'aurait guère de sens ... car tu cherches à connaitre la taille du tableau $livres.
    Mais admettons que tu crées des objets LivreManager par auteur et que tu ajoutes donc un attribut $auteur. rien ne t'interdit de définir count comme le nombre de lettres du nom de l'auteur avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return sizeof($this->auteur);
    En revanche, je trouve que tu te compliques bien la vie(le code surtout) car pour balayer touts les valeurs d'un tableau, "foreach" est vraiment plus élégant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach( $livres as $livre )
    Enfin, tu pourrais aussi, dans la classe, déclarer que $livres est un tableau ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private $livres = array();

  10. #10
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ypcman Voir le message

    En revanche, je trouve que tu te compliques bien la vie(le code surtout) car pour balayer touts les valeurs d'un tableau, "foreach" est vraiment plus élégant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach( $livres as $livre )
    D'accord avec toi mais ce code n'est pas de moi : il vient d'une formation que je fais pour réviser les concepts PHP/POO/MVC...
    Citation Envoyé par ypcman Voir le message
    Enfin, tu pourrais aussi, dans la classe, déclarer que $livres est un tableau ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private $livres = array();
    c'est ce que j'ai fait (cf post #3)

  11. #11
    Membre émérite Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Par défaut
    J'ai écrit trop vite.
    Seb a raison, l'implémentation de count() pour la classe LivreManager ne sert à rien puisque ton count() ne concerne pas un objet de la classe LivreManager comme $livreManager mais $livre.
    Si tu voulais faire count($livreManager), alors tu devrais implémenter count pour ta classe, mais dans ton cas, c'est inutile. En revanche, déclarer $livre comme array le rend countable et supprime l'erreur.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.3] call_user_func_array() expects parameter 2 to be array
    Par guytou13 dans le forum Langage
    Réponses: 3
    Dernier message: 12/07/2010, 18h15
  2. [1.x] erreur sfForm::bind() must be an array()
    Par megaloplex dans le forum Symfony
    Réponses: 3
    Dernier message: 08/07/2010, 15h53
  3. Parameter '' must be defined
    Par malvax dans le forum ADO.NET
    Réponses: 6
    Dernier message: 30/05/2010, 16h27
  4. [function.fread]: Length parameter must be > 0
    Par anxious dans le forum Langage
    Réponses: 8
    Dernier message: 06/01/2010, 21h40
  5. [Flash] [FAQ] Comment parcourir facilement un ARRAY ou un OBJECT
    Par jean philippe dans le forum Contribuez
    Réponses: 0
    Dernier message: 12/10/2006, 21h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo