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 :

Erreur 'incomplete object' sur une classe appelée dans deux fichiers séparés


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 642
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 642
    Points : 831
    Points
    831
    Par défaut Erreur 'incomplete object' sur une classe appelée dans deux fichiers séparés
    Bonjour,

    J'ai une classe de génération du code html d'une liste select vide associée à une classe de génération du code html des options. La particularité est qu'ici, J'utilise ces classes et leurs instances sur deux fichiers distincts. Le premier fichier sert au contrôle, le second sert au traitement qui consiste à remplir les listes d'options vides.
    Au départ, dans le contrôleur, je génère une première liste complète et les autres listes avec une seule option vide. Dans le traitement, je génère les options utiles manquantes en fonction du résultat de la première sélection effectuée par l'utilisateur dans le formulaire de rendu pour faire une sélection en plusieurs étapes.
    Tout le problème se situe dans le traitement avec le message d'erreur suivant:
    The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "OptListSelect\OptListSelect" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide an autoloader to load the class definition
    Je ne comprends pas pourquoi plusieurs éléments de la classe sont incomplets.
    Dans le fichier de traitement (ligne 9), j'ai placé un var_dump de contrôle qui me donne ceci:
    array (size=4)
      2 => 
        object(__PHP_Incomplete_Class)[9]
          public '__PHP_Incomplete_Class_Name' => string 'OptListSelect\OptListSelect' (length=27)
          private 'options' (OptListSelect\OptListSelect) => 
            array (size=1)
              0 => 
                object(__PHP_Incomplete_Class)[10]
                  ...
          private 'groups' (OptListSelect\OptListSelect) => 
            array (size=0)
              empty
          private 'name' (OptListSelect\OptListSelect) => string 'naf[2]' (length=6)
          private 'attributes' (OptListSelect\OptListSelect) => 
            array (size=2)
              'id' => string 'naf2' (length=4)
              'required' => string 'required' (length=8)
    Je vous donne le code du contrôleur (premier fichier appelé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    require_once('../classes/moimp/OptListSelect.php');
    require_once('../classes/moimp/OptListOption.php');
     
    use OptListSelect\OptListSelect;
    use OptListOption\OptListOption;
     
    // Création de la première liste complète (niveau 1)
    $aNAF[1]	= getNAFsection($language);
    $emptyOptionLabel = getDBText($language,16);
    $lstNaf[1] = new OptListSelect('naf[1]', ['id'=>'naf1', 'required'=>'required']);
    $lstNaf[1]->addOption(new OptListOption('', '', ['label'=>$emptyOptionLabel]));
    $sToSelect = ''; // A FINIR
    if (!empty($aNAF[1])) {
    	foreach($aNAF[1] as $aItem){
    		$aOptions = ($sToSelect == $aItem['id']) ? ['selected'=>'selected']: [];
    		$lstNaf[1]->addOption(new OptListOption($aItem['code'], $aItem['code'].' - '.$aItem[$language.'_text'], $aOptions));
    	}
    	unset($aItem);
    }
     
    // Création des listes vides
    for ($i=2; $i<=5; $i++) {
    	$lstNaf[$i] = new OptListSelect("naf[$i]", ['id'=>"naf$i", 'required'=>'required']);
    	$lstNaf[$i]->addOption(new OptListOption('', '', ['label'=>$emptyOptionLabel]));
    	$_SESSION['lstNaf'][$i] = $lstNaf[$i];
    }
    Jusque là pas de problème, les listes sont générées correctement.

    et celui du traitement (après la première sélection par l'utilisateur):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    for ($i=2; $i<=5; $i++) {
    	$lstNaf[$i] = new OptListSelect("naf[$i]", ['id'=>"naf$i", 'required'=>'required']);
    	$lstNaf[$i]->addOption(new OptListOption('', '', ['label'=>$emptyOptionLabel]));
    	$_SESSION['lstNaf'][$i] = $lstNaf[$i];
    }
     
    $language	= $_SESSION['language'];
    $lstNaf	= $_SESSION['lstNaf'];
    var_dump($lstNaf); // Produit l'affichage ci-dessus
    $post	= $_POST;
     
    // Liste des options à mettre dans les listes
    for ($i=1;$i<=5; $i++){
    	$j = $i+1;
    	if (empty($post['naf'][$i]))
    		break;
    	$aNAF[$j] = getNAF($language, $j, $post['naf'][$i]); // Collecte des données pour la liste d'options
    	$sToSelect = ''; // A FINIR
    	if (!empty($aNAF[$j])) {
    		foreach($aNAF[$j] as $aItem){
    			$aOptions = ($sToSelect == $aItem['id']) ? ['selected'=>'selected']: [];
    			$lstNaf[$j]->addOption(new OptListOption($aItem['code'], $aItem['code'].' - '.$aItem[$language.'_text'], $aOptions));
    		}
    		unset($aItem);
    	}
    }
    Suis-je assez clair? Vous faut-il d'autres éléments?

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 642
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 642
    Points : 831
    Points
    831
    Par défaut
    C'est bon, j'ai trouvé la réponse dans un autre forum. Il suffit d'inclure les fichiers de classe avant session_start().

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Ca tombe bien si tu as trouvé car ça ne me paraissait pas clair (peut-être l'était-ce pour certains). Par exemple, dans le code montré, nul part un session_start().
    Mais tu parles de l'inclusion des fichiers de classe. Si tu avais un autoloader, nul besoin de les inclure...

Discussions similaires

  1. Erreur d'index sur une List<int> dans boucle for
    Par popoliline dans le forum C#
    Réponses: 13
    Dernier message: 16/06/2010, 12h03
  2. Réponses: 6
    Dernier message: 21/07/2009, 12h37
  3. lier une classe JAVA dans un fichier JSP
    Par zezitinho dans le forum NetBeans
    Réponses: 6
    Dernier message: 21/11/2008, 11h38
  4. [VBA] Menu qui pointe sur une macro contenue dans un fichier xla protégé
    Par EvaristeGaloisBis dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/08/2007, 15h34
  5. Definition d'une classe python dans plusieurs fichiers
    Par wfargo dans le forum Général Python
    Réponses: 3
    Dernier message: 06/12/2006, 00h03

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