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 :

[POO] Objet non reconnu en tant que tel


Sujet :

Langage PHP

  1. #1
    Membre confirmé Avatar de T`lash
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Septembre 2007
    Messages : 381
    Points : 519
    Points
    519
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $mainframe = Framework::getApplication();
     
    print_r($mainframe->dataconnection->selectQuery('SELECT * FROM `test`'));
    Ce qui me donne cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    Que retournent les instructions suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  3. #3
    Membre confirmé Avatar de T`lash
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Septembre 2007
    Messages : 381
    Points : 519
    Points
    519
    Par défaut
    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 : 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
    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 : 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
    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);
    	}
     
    }
    ?>

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    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

  5. #5
    Membre confirmé Avatar de T`lash
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Septembre 2007
    Messages : 381
    Points : 519
    Points
    519
    Par défaut
    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.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    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.

  7. #7
    Membre confirmé Avatar de T`lash
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Septembre 2007
    Messages : 381
    Points : 519
    Points
    519
    Par défaut
    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 ?

Discussions similaires

  1. MySQL n'est pas reconnu en tant que commande interne
    Par momobulle dans le forum Installation
    Réponses: 4
    Dernier message: 14/03/2012, 22h58
  2. [XL-2000] Concatener (jour, mois, année), mais non reconnu en tant que date
    Par wyzer dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/03/2010, 14h08
  3. [Continuum] CVS n'est pas reconnu en tant que commande
    Par domyclas dans le forum Intégration Continue
    Réponses: 10
    Dernier message: 11/10/2007, 11h54
  4. Réponses: 3
    Dernier message: 23/09/2007, 13h50
  5. [POO] balise ou objet non reconnu lors d'un deploiement serveur
    Par benssj5 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 02/01/2006, 17h26

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