Renseignement Class POO

Eléphant du PHP | 451 Messages

30 mars 2010, 23:36

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

++

ViPHP
ViPHP | 5462 Messages

31 mars 2010, 00:05

si $this->db est une class alors tu peu lui passer une méthode

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

31 mars 2010, 10:46

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 ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 451 Messages

31 mars 2010, 18:31

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

Eléphant du PHP | 422 Messages

31 mars 2010, 18:39

hello

$query est ce que $this->.... query() retourne, ici il y a des chances que ce soit un tableau :)
toujours faire une recherche sur http://www.php.net et/ou sur http://www.google.fr :)
utiliser http://ideone.com/ pour vos codes :)

ViPHP
ViPHP | 5462 Messages

31 mars 2010, 18:41

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

Eléphant du PHP | 451 Messages

31 mars 2010, 18:43

Qu'est qui est une classe?

devlop78
Invité n'ayant pas de compte PHPfrance

01 avr. 2010, 00:07

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;

Eléphant du PHP | 451 Messages

01 avr. 2010, 18:34

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

ViPHP
ViPHP | 2287 Messages

01 avr. 2010, 21:33

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... ).
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 451 Messages

01 avr. 2010, 22:29

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

?>