Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/09/2008, 17h42   #1
Membre éclairé
 
Avatar de T`lash
 
Inscription : septembre 2007
Messages : 305
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : septembre 2007
Messages : 305
Points : 323
Points : 323
Envoyer un message via MSN à T`lash
Par défaut [POO] Objet non reconnu en tant que tel

Bonjour, j'ai une erreur que cela soit avec php5 ou php4.

Pour résumer, j'ai une classe MySQLConnection dans un fichier mysqlconnection.php, une classe TYMApplication dans un fichier application.php, une classe Framework dans un fichier framework.php et mon fichier index.php.

Tout les includes sont fait et j'ai ceci dans mon index.php :

Code :
1
2
3
$mainframe = Framework::getApplication();
 
print_r($mainframe->dataconnection->selectQuery('SELECT * FROM `test`'));
Ce qui me donne cette erreur :

Code :
Fatal error: Call to a member function on a non-object in C:\Sites Internet\XXXXXXXXXX\www\index.php on line 14
La méthode getApplication() de la classe Framework instancie la classe TYMApplication qui est un singleton.
Le constructeur de la classe TYMApplication crée une instance de MySQLConnection et la range dans son membre $dataconnection.

dans la classe TYMApplication je peux travailler avec $dataconnection en sa qualité d'objet, mais pas dans mon index.php.
T`lash est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2008, 17h57   #2
Expert Confirmé
 
Avatar de Eusebe
 
Inscription : mars 2006
Messages : 1 989
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : mars 2006
Messages : 1 989
Points : 3 606
Points : 3 606
Bonjour,

Que retournent les instructions suivantes :
Code :
1
2
3
4
5
$mainframe = Framework::getApplication();
 
echo '<pre>';
var_dump($mainframe);
echo '</pre>';
Si comme je le crains dataconnection n'est pas initialisé, nous ne pourrons pas faire grand chose de plus sans voir le contenu de tes classes...
Eusebe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2008, 18h19   #3
Membre éclairé
 
Avatar de T`lash
 
Inscription : septembre 2007
Messages : 305
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : septembre 2007
Messages : 305
Points : 323
Points : 323
Envoyer un message via MSN à T`lash
C'est dur de faire de la POO avec un langage pas vraiment fait pour ça.....

En fait $mainframe non plus n'est pas initialisé alors qu'il rentre bien dans le constructeur. vardump me renvoi NULL.

application.php :
Code :
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
27
28
29
30
31
32
33
34
35
36
<?php
defined('_TYMEXEC') or die('Acces Restreint');
 
classimport('core.security');
 
class TYMApplication {
 
	var $instance;
	var $config;
	var $dataconnection;
 
	function TYMApplication($templates_path){
		$this->config = new TYMConfig();
		$this->initDBConnect();
	}
 
	function initDBConnect(){
		if ($this->config->dbtype == 'mysql'){
			$this->dataconnection = new MySQLConnection($this->config->dbhost, $this->config->dbuser, $this->config->dbpassword);
		}
		$this->dataconnection->open();
		$this->dataconnection->select($this->config->dbname);
		define('DB_PREFIX', $this->config->dbprefix);
	}
 
	function __destruct(){
		$this->dataconnection->close();
	}
 
	function getInstance($templates_path){
		if (!isset($instance)){
			$instance = new TYMApplication($templates_path);
		}
	}
}
?>
mysqlconnection.php :
Code :
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php
defined('_TYMEXEC') or die('Acces Restreint');
 
class MySQLConnection extends DataConnector {
	var $database;
	var $dbhost;
	var $dbuser;
	var $dbpassword;
 
	function MySQLConnection($dbhost, $dbuser, $dbpassword){
		$this->dbhost = $dbhost;
		$this->dbuser = $dbuser;
		$this->dbpassword = $dbpassword;
	}
 
	function open(){
		if (!($this->database = mysql_connect($this->dbhost, $this->dbuser, $this->dbpassword))){
			// Si la connexion avec MySQL est impossible, afficher un message et mettre fin au script
			die(mysql_errno($this->database) . " Connexion à la base de données impossible : " . mysql_error($this->database) . "<br />"
			   . "<p>Certains problèmes techniques empêchent la connexion avec la base de données. "
			   . "Nous nous en excusons.</p>");
		}
	}
 
	function close(){
		mysql_close($this->database);
	}
 
	function select($dbname){
		if (!mysql_select_db($dbname)){
	      // Si on ne peut pas sélectionner la base de données
	      error_manager(mysql_errno(), "Sélection de la base de données impossible : " . mysql_error());
	      // Afficher un message pour l'utilisateur et mettre fin au script
	      echo "<p>" . "Certains problèmes techniques empêchent la connexion avec la base de données. Nous nous en excusons.</p>";
	      exit();
	    }
	}
 
	function selectQuery($rq){
		$result = @mysql_query($rq, $this->database) or die (mysql_error($this->database));
		if (mysql_num_rows($result) > 0){
		  $i = 0;
		  while ($ligne = mysql_fetch_array($result, MYSQL_BOTH)){
		    $resultset[$i] = $ligne;
			$i++;
		  }
		  return $resultset;
		}
		return false;
	}
 
	function countQuery($rq){
		$result = @mysql_query($rq, $this->database) or die (mysql_error($this->database));
		return mysql_num_rows($result);
	}
 
	function insertQuery($rq){
		$result = @mysql_query($rq, $this->database) or die (mysql_error($this->database));
		return @mysql_insert_id($this->database);
	}
 
	function updateQuery($rq){
		$result = @mysql_query($rq, $this->database) or die (mysql_error($this->database));
		return @mysql_affected_rows($this->database);
	}
 
}
?>
T`lash est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2008, 19h39   #4
Membre Expert
 
Inscription : janvier 2007
Messages : 1 452
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2007
Messages : 1 452
Points : 1 914
Points : 1 914
Citation:
Envoyé par T`lash Voir le message
C'est dur de faire de la POO avec un langage pas vraiment fait pour ça.....
UE!... passons.


Sinon se serait pas mal de poster la classe Framework.

Et quoique sa n'a rien à voir avec $mainFrame. Mais pour un getter TYMApplication::getInstance ne retourne rien.
C'est normal ?

tu pourras aussi mettre le ctor en protected, et getinstance en static.
En fait, plus je lit avec attention ton code.
Plus mes certitudes s'effacent sur ce que tu souhaites faire.
$instance dans getInstance, est il censé avoir un scope plus grand que celui de la méthode ? Car là il ne sera strictement jamais ô p* de grd jamais définit.
Pour le ctor, __construct sera suffisant.
Là c'est la syntaxe php4 que tu utilises, ce qui ne colles pas avec ton __destruct.
Tout comme les var.
Enfin la je ne sais plus si c'est du php4 ou php5 que tu souhaites faire, donc...

Dans mysqlconnection, le membre database devrait plutôt être dblink. Si tu veux être raccord avec les habitudes du langage. Car ce que tu y stockes et un lien vers la db. Pas le nom de la db. Mais ça c'est histoire juste pour faire joli.

fin voila en passant,

a plus
kaymak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2008, 20h07   #5
Membre éclairé
 
Avatar de T`lash
 
Inscription : septembre 2007
Messages : 305
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : septembre 2007
Messages : 305
Points : 323
Points : 323
Envoyer un message via MSN à T`lash
j'ai commencé à faire du php5 quand je me suis rendu compte qu'en fait le serveur sur lequel ce code sera exécuté utilise php 4.4.9.
J'ai pourtant vu des applications (Joomla!) tournant sur php4 utiliser les constructeurs __construct().

Et merci de m'avoir fait remarquer que mon getInstance() fonctionnerait mieux si je n'avais pas oublié le return. Je vais corriger ça.

Et les mots-clefs static, public, private, etc c'est bien uniquement en php5, non ? Parce que j'ai dû les enlever pour que mon code fonctionne en php4.
T`lash est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2008, 20h09   #6
Membre Expert
 
Inscription : janvier 2007
Messages : 1 452
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2007
Messages : 1 452
Points : 1 914
Points : 1 914
ok. donc surtout pas de protected ou de static.
Sinon tu aura de nouveaux messages d'erreurs et tu nous diras encore que c'est la faute du langage ^^ : )

Sinon sa donnes quoi la classe Framework ?

edit
ni de __construct ni __destruct en passant. Pour ce qui est de joomla il on dû créer un bout de code magique pour rendre leur code compat php4 et 5, sans pour autant compliquer le déploiement.
kaymak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2008, 20h12   #7
Membre éclairé
 
Avatar de T`lash
 
Inscription : septembre 2007
Messages : 305
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : septembre 2007
Messages : 305
Points : 323
Points : 323
Envoyer un message via MSN à T`lash
Citation:
Envoyé par kaymak Voir le message
ok. donc surtout pas de protected ou de static.
Sinon tu aura de nouveaux messages d'erreurs et tu nous diras encore que c'est la faute du langage ^^ : )

Sinon sa donnes quoi la classe Framework ?
Rien n'est la faute du langage, j'aime beaucoup le PHP fonctionnel et j'en fait depuis déjà quelques années, mais comme c'est précisé dans les ouvrages de référence, ce n'est pas un langage orienté objet. De plus en plus avec PHP5, mais c'est encore un hybride.


Edit: Merci, tout fonctionne. Des regards extérieurs et la petite erreur à la con disparait. Par contre, savez-vous comment faire fonctionner les constructeurs version php5 avec un analyseur php4 comme je le disais avant ?
T`lash est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h21.


 
 
 
 
Partenaires

Hébergement Web