Page 1 sur 1

Renseignement Class POO

Posté : 30 mars 2010, 23:36
par djtec
Bonsoir,

Voilà j'ai vu que sur certain FrameWork il utilisait une certaine synthaxe dans leur classe.

Exemple:
$query = $this->db->query("REQUETE SQL");

while($data = $query->result()) {
}
Tiré du FrameWork CodeIgniter

Donc je me demandais comment faire celà. Du moins comment $query peut remplacer le $this->db sachant que les deux fonctions sont dans le même fichier et dans la même classe?

Et que le code montré plus haut est dans un fichier complètement à part de la classe DB.

Merci d'avance....

++

Re: Renseignement Class POO

Posté : 31 mars 2010, 00:05
par stealth35
si $this->db est une class alors tu peu lui passer une méthode

Re: Renseignement Class POO

Posté : 31 mars 2010, 10:46
par zeus
Toujours aussi pédagogue stealth35 ;)

imaginons le code suivant :
class A
{
  public function foobar()
  {
    $db = new DB();
    $this->db = $db
  }
}
jusque là, rien de choquant, non ?
$this->db contient une instance de la classe DB().

Maintenant, regardons le code suivant :
$db = new DB();
$db->query('...');
Toujours rien de choquant, vrai ?
On exécute la méthode query() sur l'objet $db, qui est une instance de la classe DB().

Tu es donc d'accord qu'il est possible d'exécuter des méthodes de la classe DB() sur une instance de cette classe ?
Donc, maintenant, le code suivant :
class A
{
  public function foobar()
  {
    $db = new DB();
    $this->db = $db;
    $this->db->query('...');
  }
}
Le code est toujours correct, puisqu'il exécute la méthode query() sur une instance de la classe DB(), qui est stockée dans un attribut de la classe A.


Et maintenant, pour finir, le code suivant :
class A
{
  public function __construct()
  {
    $this->db = new DB();
  }

  public function foobar()
  {
    $this->db->query('...');
  }
}
Dans le code suivant, dès que l'on va instancier la classe A (new A()), on va créer une instance de la classe DB() qui sera stockée dans un attribut de la classe.
Ensuite, lorsque l'on va exécuter la méthode $A->foobar(), on va utiliser cette instance de DB() pour lui faire exécuter une méthode.

Est-ce que cette explication est plus claire ?

Re: Renseignement Class POO

Posté : 31 mars 2010, 18:31
par djtec
Oui ça j'ai compris merci pour toute les explications mais je voulais surtout savoir comment $query qui est le résultat de la requête peut devenir un objet pour une classe ou il y a rien de défini pour cette variable.

$query peut être $maVariable peut importe ce que l'on met comme variable pour récupérer le résultat celle ci deviens un objet de la classe

Re: Renseignement Class POO

Posté : 31 mars 2010, 18:39
par telnes
hello

$query est ce que $this->.... query() retourne, ici il y a des chances que ce soit un tableau :)

Re: Renseignement Class POO

Posté : 31 mars 2010, 18:41
par stealth35
hello

$query est ce que $this->.... query() retourne, ici il y a des chances que ce soit un tableau :)
non c'est une class puisque qu'apres t'as $query->result()

$data sera peu être un tableau par contre

Re: Renseignement Class POO

Posté : 31 mars 2010, 18:43
par djtec
Qu'est qui est une classe?

Re: Renseignement Class POO

Posté : 01 avr. 2010, 00:07
par devlop78
Tu as répondu toi même alors ... $query est un objet ...

Ce qui est drôle c'est de faire des trucs comme $var1->var2->var3->var4->methode(); :D

Peut être qu'il y a un truc du genre

$objet = new Request();
$object->donnees = mysql_machintruc;
return $object;

Re: Renseignement Class POO

Posté : 01 avr. 2010, 18:34
par djtec
Ça y ai j'ai trouvé il suffisait de retourner un new class() dans $query et le tour est joué.

Voici le code:
<?php

class DB extends DB_Driver {
}

class DB_Driver {
	var $_return;
	
	function query($string) {
		$this->_return = $string;
		
		$RES = new Mysql();
		
		return $RES;
	}
}

class Mysql extends DB {
	var $__return;
	
	function result() {
		return $this->_return;
	}
}

$db = new DB();

$query = $db->query('REQUETE SQL');

echo $query->result();

?>

Par contre le echo ne me retourne rien du tout est ce normal???

Re: Renseignement Class POO

Posté : 01 avr. 2010, 21:33
par Calimero
Par contre le echo ne me retourne rien du tout est ce normal???
Oui... Tu as un gros bazar dans tes classes ( A hérite de B, B hérite de C, C invoque A... ).

Re: Renseignement Class POO

Posté : 01 avr. 2010, 22:29
par djtec
Oui c'est parce que j'essayais un peu tout pour que ça fonctionne.

Mais j'y suis arriver merci.

Voici le résultat si quelqu'un veux savoir:
<?php

class DB {
	function query($string) {
		$RES = new Mysql();
		$RES->_req_query = $string;
		$RES->_query();

		return $RES;
	}
	
	function result() {
		return $this->_fetch_object();
	}
}

class Mysql extends DB {
	var $_req_query;
	var $_req_fetch;
	
	function _query() {
		$this->_req_fetch = $this->_req_query;
	}
	
	function _fetch_object() {
		return $this->_req_fetch;
	}
}

$db = new DB();

$query = $db->query('REQUETE SQL');

echo $query->result();

?>