Incompréhension pour déclarer une variable

Petit nouveau ! | 3 Messages

29 août 2010, 11:33

Bonjour à tous,

J'ai du rater un épisode, sur un bout de code j'ai une une du type NOTICE.
class system
{
	// DECLARATION DES PROPRIETES
	public $system;
	// $system->page       // Toutes les infos concernant la page en cours
	// $system->html       // Contient toutes les balises html
	// $system->bdd        // Travail avec la base de données
	// $system->user       // Toutes les infos de l'utilisateur
	public $id_page;       // La page appelée à l'origine
	public $erreur_fatale; // Si à True, l'utilisateur est redirigée vers une page simple, lui indiquant une erreur.
	public $langue;        // Langue de la page en cours
	
	// CONSTRUCTEUR
	public function __construct ()
	{
		// INCLUSION DES FICHIERS
		require_once ('config.conf.php');                 // Fichier config
		require_once (DOSSIER_OUTILS.'fonctions.inc.php');// Ensemble de fonctions utiles
		require_once (DOSSIER_OUTILS.'bdd.class.php');    // Class de la base de données
		
		// INITIALISATION DES VARIABLES
		$this->erreur_fatale = false;
		$this->system->bdd = new bdd();
	}
}
Voilà et à l'appel de cette class, j'ai cette erreur
Strict Standards: Creating default object from empty value in
Correspondant à la ligne $this->system->bdd = new bdd();

Je comprends qu'il n'est pas content parce que $this->system est vide.
Mais dans mon cas, comment faire ça propre pour que je puisse lui attribuer uniquement ces objets :
  • $system->page
  • $system->html
  • $system->bdd
  • $system->user

ViPHP
ViPHP | 5462 Messages

29 août 2010, 19:10

il faut faire une class system

Mammouth du PHP | 1511 Messages

29 août 2010, 20:40

Fais un $this->system = new stdClass(); avant de faire ton $this->system->bdd = new bdd;
Tu essaies d'attribuer une proprièté a une instance de classe alors qu'il n'y en a aucune.

Petit nouveau ! | 3 Messages

31 août 2010, 14:19

Merci de la réponse. Par contre
$system n'est pas une instance de class, c'est une propriété de la class system qui aurait pu s'appeler $toto ou $tata.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

31 août 2010, 14:31

ok, alors prenons le problème autrement : en dehors du modèle objet.
Un attribut n'est, ni plus, ni moins qu'une variable.

Est-ce qu'écrire ça te choque ?
$tata;
$tata->bdd = 'qqchose';
Oui, certainement ...
Et bien dans une classe, c'est la même chose, un attribut n'est pas magique, et tu ne peux pas accéder à des éléments qui sont en dessous comme ça, à moins que l'attribut soit lui même une instance de classe ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 3 Messages

31 août 2010, 18:59

Donc la solution visant à faire un
$this->system = new stdClass();
est propre ?

En gros je déclare que $this->system est une instance de class avec ça.
Ca me parait pas propre, je ne suis pas le seul martien à vouloir faire un truc de la sorte tout de même ?

Surtout que je veux y stocker des instances de class effectivement mais aussi des array.
Bref, tout mon system (d'où son nom) utile à chaque page se trouve dedans.

ViPHP
ViPHP | 5462 Messages

31 août 2010, 19:21

Donc la solution visant à faire un
$this->system = new stdClass();
est propre ?

En gros je déclare que $this->system est une instance de class avec ça.
Ca me parait pas propre, je ne suis pas le seul martien à vouloir faire un truc de la sorte tout de même ?

Surtout que je veux y stocker des instances de class effectivement mais aussi des array.
Bref, tout mon system (d'où son nom) utile à chaque page se trouve dedans.

faire $this->system , c'est juste que tu lui donne une propriété qui s’appelle 'systeme' c'est tout, en rien c'est une classe

donc a un moment ou un autre, faut bien lui dire que c'est une classe, sois ta une class systeme et tu fais
$this->system = new System();

sois c'est rien, et en gros au lieu de stocker dans un tableau tu stockes dans un objet et la tu feras
$this->system = new stdClass();

niveau propété, sois tu fais une class System sois tu met ca dans un array

$this->system = array();
$this->system['bdd'] = new bdd();

je te conseil d'allé voir du coté du pattern Registry