Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1217 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] include et class : petite question

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PHP] include et class : petite question

n°604245
Big-Foot
Posté le 06-01-2004 à 21:18:56  profilanswer
 

hello,
 
Disons que j'ai une page index.php, une class A.php et une class B.php
 
Je fait un include de la class A dans index.php, et juste à la suite je fait un $a = new A();
Jusque là c'est ok.
 
Après ca je fait un include de la class B dans index.php
Et c'est la le probleme : dans ma class B j'utilse la class A, mais celle-ci n'est pas incluse dans le B.php mais seulement dans le index.php
 
Je croyais que ca fonctionnerais mais il semble que non :/
Est ce que c'est une erreur de ma part (je l'espère en tout cas, sinon je vais bien m'amuser...)


Message édité par Big-Foot le 06-01-2004 à 21:20:32
mood
Publicité
Posté le 06-01-2004 à 21:18:56  profilanswer
 

n°604252
ethernal
Chercheur de vérité...
Posté le 06-01-2004 à 21:30:23  profilanswer
 

tu utilises la classe A dans B ? tu veux dire que tu utilises un objet de type classe A non ?
 
pcq ce que tu dis fonctionne...
 
index.php

Code :
  1. <?
  2. include "A.class.php";
  3. $a = new A();
  4. include "B.class.php";
  5. $b= new B();
  6. include "C.class.php";
  7. $c= new C();
  8. ?>


B.Class.php

Code :
  1. <?
  2. class B {
  3. var $A;
  4.   function B(){
  5.     $A = new A();
  6.   }
  7. }
  8. ?>


et ça aussi ça fct.
 
C.class.php

Code :
  1. <?
  2. class C extends B{
  3. var $A;
  4.   function C(){
  5.     $A = new A();
  6.   }
  7. }
  8. ?>


Message édité par ethernal le 06-01-2004 à 21:31:35
n°604260
Big-Foot
Posté le 06-01-2004 à 21:36:11  profilanswer
 

Citation :

tu utilises la classe A dans B ? tu veux dire que tu utilises un objet de type classe A non ?


oui c'est ca.
 
En reprenant ton exemple :  
 
 
B.Class.php

Code :
  1. <?
  2. class B {
  3. var $y;
  4. function test(){
  5.    $A->unefonctiondeA($y)         // disons que cette fonction existe
  6. }
  7. }
  8. ?>


 
Je peu donc fait ca ??

n°604266
ethernal
Chercheur de vérité...
Posté le 06-01-2004 à 21:40:05  profilanswer
 

oui, mais il faut évidemment que ton objet $A existe dans ta classe B
 

Code :
  1. <?
  2.   class B {
  3.     var $y;
  4.     var $A;
  5.    
  6.      function test(){
  7.          $this->A->unefonctiondeA($y)         // disons que cette fonction existe  
  8.    // zut je sais plus si ça fct :( edit -- oui ça fct
  9.      }
  10.    function PassObject($monObjetA){
  11.      $this->$A= $monObjetA;
  12.    }
  13.   }
  14. ?>


Message édité par ethernal le 06-01-2004 à 21:42:33
n°604275
Big-Foot
Posté le 06-01-2004 à 21:50:43  profilanswer
 

ah ok, voila ce que j'avais pas mis.
 
Donc si dans ma page index.php j'ai :

Code :
  1. <?
  2. include "A.class.php";
  3. $a = new A();
  4. include "B.class.php";
  5. $b= new B();
  6. ?>


 
dans B.class.php il me suffit d'avoir :
 
<?  
 class B {  
   var $y;  
   var $A;
     
    function test(){  
        $this->A->unefonctiondeA($y)
    }
 }  
?>
 
C'est ca ?
Ou est ce que j'ai besoins encore de :

Code :
  1. function PassObject($monObjetA){
  2.     $this->$A= $monObjetA;
  3.   }


Ca je comprend pas très bien

n°604278
mrbebert
Posté le 06-01-2004 à 21:53:51  profilanswer
 

Il affecte à une variable de la classe un objet qui a été passé en paramètre, rien de plus [:proy]

n°604279
ethernal
Chercheur de vérité...
Posté le 06-01-2004 à 21:55:05  profilanswer
 

ta classe B ne connait pas ton objet $A, donc tu es obligé de le lui passer à un moment ou un autre.

n°604290
Big-Foot
Posté le 06-01-2004 à 22:11:07  profilanswer
 

ok je crois que j'ai compris le principe :jap:  
 
Mais ca marche pas encore. J'ai fait quelque chose comme ca dans index.php:
 
$B->PassObject($A->lafonctiondeA());
 

n°604299
Big-Foot
Posté le 06-01-2004 à 22:16:14  profilanswer
 

ou bien ca ?
 
 include "A.class.php";
  $a = new A();
  include "B.class.php";
  $b= new B();
$B->PassObject($a);  
 
mais je pense pas...

n°604371
naceroth
Posté le 07-01-2004 à 01:13:13  profilanswer
 

big-foot a écrit :


Et c'est la le probleme : dans ma class B j'utilse la class A, mais celle-ci n'est pas incluse dans le B.php mais seulement dans le index.php


 
Si tu as juste besoin d'une méthode de la classe A plutôt que de l'objet lui-même, tu devrais pouvoir le passer par référence non ?

mood
Publicité
Posté le 07-01-2004 à 01:13:13  profilanswer
 

n°604680
Big-Foot
Posté le 07-01-2004 à 13:08:12  profilanswer
 

naceroth a écrit :


Si tu as juste besoin d'une méthode de la classe A plutôt que de l'objet lui-même, tu devrais pouvoir le passer par référence non ?


désolé je comprend pas là, je suis pas encore surper fort en prog orienté objet...
 
Est ce que tu peu ecrire ce qui manque dans mon exemple stp ?
J'ai ca :
 
une class : database.php
une class : page_title.php
une page index.php
 
Ma class database.php :

Code :
  1. <?
  2. Class DataBase
  3. {
  4. var....
  5. function DbSelect($sql)
  6.     { // blablabla
  7.     }
  8. }
  9. ?>


 
ma class page_title.php :

Code :
  1. <?
  2. Class PageTitle
  3. {
  4.    var...
  5.    var $database;        // <-- c'est ca ? que je doit mettre ???
  6.     function PageToTitle()
  7.     { // ICI J'UTILISE $database->DbSelect($sql);
  8.     }
  9.     function PassObject($monObjet)
  10.     {
  11.     $this->$database = $monObjet;
  12.     }
  13. }
  14. ?>


 
ma page index.php :

Code :
  1. <?php
  2. // j' "include" les 2 class vu plus haut
  3. $database = new DataBase();
  4. $pagetitle = new PageTitle();
  5. $pagetitle->PassObject($database);  // C'est ca ??
  6. $pagetitle->PageToTitle();


 
J'éspere que vous me direz comment faire pour que ca marche :)


Message édité par Big-Foot le 07-01-2004 à 13:10:50
n°604897
naceroth
Posté le 07-01-2004 à 16:56:14  profilanswer
 

Big-Foot a écrit :


désolé je comprend pas là, je suis pas encore surper fort en prog orienté objet...


 
ok, on va y aller lentement alors :)
 
class database.php :

Code :
  1. <?
  2. Class DataBase
  3. {
  4. var....
  5. function DbSelect($sql)
  6.     { // blablabla
  7.     }
  8. }
  9. ?>


 
change pas, il faut juste que dans DbSelect tu n'utilises pas d'autre élément de la classe (donc pas de $this-> dans la fonction)
 
class page_title.php :

Code :
  1. <?
  2. Class PageTitle
  3. {
  4.    var...
  5.     function PageToTitle()
  6.     {
  7.        DataBase::DbSelect(...); //passage par référence
  8.     }
  9. }
  10. ?>


 
index.php :

Code :
  1. <?php
  2. // j' "include" les 2 class vu plus haut
  3. $pagetitle = new PageTitle();
  4. $pagetitle->PageToTitle();
  5. ?>


 
Le passage par référence consiste à utiliser une fonction d'une classe (ici DataBase) sans créer l'objet correspondant. Attention toutefois, comme tu ne crées pas l'objet, tu n'as pas accès à ses propriétés, donc pas d'accès aux variables de DataBase.

n°605168
ethernal
Chercheur de vérité...
Posté le 07-01-2004 à 20:58:37  profilanswer
 

utilises plutôt le singleton pour la DB

Code :
  1. class DB{
  2. var $connexion;
  3. // création
  4. function DB(){
  5.   ...
  6. }
  7. // singleton
  8. function getDB(){
  9.    if ( !is_object($this->connexion) ) {
  10.       $this->connexion= new DB();
  11.    }
  12.    return $this->connexion;
  13. }
  14. }


 
dans tes autres classes tu peux l'appeller comme l'a dit naceroth par  

Code :
  1. $myDB= DB::getDB();
  2. $myDB->query("Select * from users" );


 
Si elle n'existe pas, elle sera crée, sinon tu utiliseras l'existante ce qui te permettra par exemple de faire des stats comme indiquer combien de querys tu as faits pour afficher ta page.  De plus tu n'auras qu'une connexion à ta DB par page, ce qui peux être mieux (mais ça ça a fait l'objet de pas mal de discussion pour savoir s'il vaut mieux faire une query et fermer la connexion directmeent ou pas...).


Message édité par ethernal le 07-01-2004 à 20:59:59
n°605198
Big-Foot
Posté le 07-01-2004 à 21:39:40  profilanswer
 

merci de vos reponses j'essaye tous ca des que je peu

n°605771
Big-Foot
Posté le 08-01-2004 à 18:01:22  profilanswer
 

Citation :

change pas, il faut juste que dans DbSelect tu n'utilises pas d'autre élément de la classe (donc pas de $this-> dans la fonction)


Et si justement il a des élements de la classe je fait comment ?


Message édité par Big-Foot le 08-01-2004 à 18:01:35
n°605822
ethernal
Chercheur de vérité...
Posté le 08-01-2004 à 20:07:52  profilanswer
 

avec ma méthode.

n°607326
Big-Foot
Posté le 10-01-2004 à 19:36:24  profilanswer
 

oki j'ai utilisé ta methode ethernal, dans database j'ai mis ca :

Code :
  1. // singleton
  2.     function getDB()
  3.     {
  4.         if (!is_object($this->DbQuery))
  5.         {
  6.         $this->DbQuery = new DataBase();
  7.         }
  8.         return $this->DbQuery;
  9.     }


 
1 bon point déjà, ca me fait pas d'erreur  :D  
Mais ca ne sort rien de la db j'ai limpression.
Est ce que ca pose probleme si avant de faire un  $pagetitle = new PageTitle();  j'ai déjà un   $database = new DataBase(); ?

n°607605
ethernal
Chercheur de vérité...
Posté le 11-01-2004 à 01:43:18  profilanswer
 

tu ne dois jamais utiliser new database() dans ton code, mais bien  
$database= Database::getDB();


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] include et class : petite question

 

Sujets relatifs
Sélectionner un client parmi une liste "géante" via PHP[PHP] Comment savoir si ma page est appelé par un formulaire ?
petite question a propos d'electronique et programmation...[PHP] Construire un code solide pour un site web,les etapes?
[PHP] connaitre l'ip depuis laquelle un formulaire est postégénérer une page html sur mesure en PHP?
[PHP] Couper une chaîne de caractères...Support des threads dans PHP ?
[PHP/Mysql] enregistrer tableau dans bdd 
Plus de sujets relatifs à : [PHP] include et class : petite question


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR