[PHP] include et class : petite question

include et class : petite question [PHP] - PHP - Programmation

Marsh Posté le 06-01-2004 à 21:18:56    

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
Reply

Marsh Posté le 06-01-2004 à 21:18:56   

Reply

Marsh Posté le 06-01-2004 à 21:30:23    

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
Reply

Marsh Posté le 06-01-2004 à 21:36:11    

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 ??

Reply

Marsh Posté le 06-01-2004 à 21:40:05    

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
Reply

Marsh Posté le 06-01-2004 à 21:50:43    

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

Reply

Marsh Posté le 06-01-2004 à 21:53:51    

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

Reply

Marsh Posté le 06-01-2004 à 21:55:05    

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

Reply

Marsh Posté le 06-01-2004 à 22:11:07    

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());
 

Reply

Marsh Posté le 06-01-2004 à 22:16:14    

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

Reply

Marsh Posté le 07-01-2004 à 01:13:13    

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 ?

Reply

Marsh Posté le 07-01-2004 à 01:13:13   

Reply

Marsh Posté le 07-01-2004 à 13:08:12    

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
Reply

Marsh Posté le 07-01-2004 à 16:56:14    

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.

Reply

Marsh Posté le 07-01-2004 à 20:58:37    

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
Reply

Marsh Posté le 07-01-2004 à 21:39:40    

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

Reply

Marsh Posté le 08-01-2004 à 18:01:22    

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
Reply

Marsh Posté le 08-01-2004 à 20:07:52    

avec ma méthode.

Reply

Marsh Posté le 10-01-2004 à 19:36:24    

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(); ?

Reply

Marsh Posté le 11-01-2004 à 01:43:18    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed