Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/01/2011, 18h30   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 73
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 73
Points : 11
Points : 11
Par défaut PHP et l'aggrégation

Bonjours a tous,

Je souhaiterai savoir s'il est possible d'utiliser l'agrégation/composition comme en java ?!
Je m'explique, l'idée serait que le constructeur d'un objet puisse recevoir un autre objet dans sa liste de ses argument ?!

Dans l'attente de vous lire,
Kazuzu
kazuzu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 18h47   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 015
Points : 5 015
Hello

Dans son modèle Objet, PHP ressemble beaucoup à Java (si on oublie toutes les boulettes...)
Une composition ou un héritage privé sont bien entendu faisables en PHP, considérons le code suivant:
Code :
1
2
3
4
5
6
7
8
9
10
11
 
class A { protected $_message = "hello"; }
class B { 
  protected $_a;
  public function __construct (A $a) { $this->_a = $a; } 
}
 
$a = new A;
$b = new B($a);
 
var_dump($b);
Va produire:
Code :
1
2
3
4
5
6
7
8
 
object(B)#2 (1) {
  ["_a":protected]=>
  object(A)#1 (1) {
    ["_message":protected]=>
    string(5) "hello"
  }
}
Du fait du typage faible des variables en PHP, on peut passer n'importe quoi à une fonction / méthode. utiliser une signature comme suit:
Code :
1
2
 
public function __construct (A $a)
force la variable $a à être un objet du type A.

Je souhaite ajouter que les fonction magiques __get, __set et __call peuvent servir à implémenter un héritage privé, considérons le code suivant:
Code :
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
 
class A
{
	public $_a1;
	public $_a2;
	public $_a3;
}
 
class B
{
	protected $_a;
 
	public function __construct (A $a)
	{
		$this->_a = $a;
	}
 
	public function __get ($key)
	{
		return $this->_a->$key;
	}
 
	public function __set ($key, $value)
	{
		$this->_a->$key = $value;
	}
}
 
$a = new A;
$b = new B($a);
 
$b->_a1 = "Hello";
$b->_a3 = "Toto";
 
echo "$b->_a1 $b->_a3";
Va afficher: Hello Toto.
De la mème manière, on peut utiliser __call pour appeller des méthodes de A depuis B.

La doc sur les méthodes magiques :http://php.net/manual/fr/language.oop5.magic.php
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 22h03   #3
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 73
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 73
Points : 11
Points : 11
merci de ta réponse il y a quelques petites choses que je nai pas très bien comprises mais que je prendrait le temps d analyser demain matin.

J'aurai encore 1 question à posé :

1.j ai instancier une matrice :

Code :
1
2
3
4
5
6
 
 $menu = array();
for($i=0;$i<nb;$i++)
{
    $menu[$i] = array();
}
Et donc en c++ quand on alloue de la mémoire(ici c'est pas vraiment le meme) il faut le delete avec le desstructeur mais lorsque dans le destructeur php je met ce qu'il suit il me renvoi une erreur :
Code :
1
2
3
4
5
 
public function __destruct()
{
    delete[] $menu;
}
cela sert-il de detruire comme sa en php ?
kazuzu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 23h47   #4
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 015
Points : 5 015
Houlà, je crois que tu t'es emmélé es pinceaux.

En PHP, array n'est pas un constructeur d'objet, c'est un type natif - je sais, c'est assez débile de l'avoir fait avec cette signature mais c'est comme ça.
En revanche il existe des objets tableaux qui ont le comportement d'un tableau par ailleur - exactement comme en C++ avec la surcharge de l'opétaeur [ ].
En PHP il n'est pas vraiment possible de surcharger les opérateurs, mais PHP est capable de reconnaitre des classes ayant un comportement de type array par leur interface ArrayAccess, de même PHP est capable de traiter des objets comme des fonctions s'ils implémentent la méthode __invoke().

Un petit exemple pratique:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
// Un tableau: type natif
$a = array(1,2,3);
 
// Un objet Tableau
$b = ArrayObject($a);
 
$a[0] = 1; // fonctionne
$b[0] = 1; // fonctionne également
 
// Itérer un tableau natif
foreach ($a as $key => $value) 
// ou
for ($i = 0; $i < count($a); $i ++)
 
// Itérer un objet Tableau
// se fait de la même manière
// car ArrayObject implémente 
// l'interface countable.
Le seul réel intérêt des objets tableau est l'héritage public et les Iterateurs qu'on peut mettre dessus. Vu que le type natif gère parfaitement les tableaux à N dimentions et les couples clés/valeur, c'est essentiellement eux que tu utilisera.

Jettes un oeil du coté de ArrayObject: http://php.net/manual/fr/class.arrayobject.php

En PHP les destructeurs servent moins à libérer de la mémoire qu'a fermer proprement des ressources (fichiers, connexion etc.)
On peut faire l'équivalent d'un Free simplement en utilisant la fonction unset($var);
Sache également que PHP 5.3 intègre un garbage collector, à la mode Java, c'est à dire qu'on sait jamais quand il passe ni qu'est ce qu'il fait

En PHP il est rarissime de tomber dans une erreur d'allocation mémoire - une taille mémoire max est définie dans le fichier de conf de php. De toute façon, une fois qu'une requête à été traitée et son retour servi en intégralité, PHP tombe et tous tes objets / ressources font de même.
Pour la petite histoire, je travaille actuellement sur un mécanisme de cache capable de palier à cette insuffisance du langage, ça existe dans les framework les plus connus.

Une note annexe sur ArrayObject, les gens de chez Zend nous ont gratifié d'une librairie d'objets standards, un petit peu comme la STL mais sans les templates, appelée SPL pour Standard PHP Library. Cette librairie comprends des exceptions, de nouvelles interfaces ainsi que les Iterateur qui jusqu'ici manquaient au langage. Selon moi, ce sont des briques incontournables pour construire une bonne application PHP.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h41.


 
 
 
 
Partenaires

Hébergement Web