Archives de catégorie : PHP objet

Cette catégorie regroupe tous les articles des 30 minutes que j’ai passé (presque) chaque jour sur le PHP Objet au tout début de « 30 minutes par jour ». Réflexions, découvertes, tests, exemples et projets, voilà ce que vous y trouvez !

Logo Eclipse

Générer automatiquement getters et setters PHP avec Eclipse PDT

Publié dans PHP objet | Laisser un commentaire

Plusieurs solutions s’offrent à nous :

  • Générer des templates Eclipse : semi-automatique, il y a de la manutention à faire pour chaque variable
  • Utiliser le plugin Eclipse PDT E-Surf : automatique et fonctionnel mais pas très propre (rajoute carrément un menu entre « Run » et « Windows ») et non-configurable
  • Utiliser le plugin Eclipse PDT PHPClassGenerator d’IBM pour générer directement une classe et ses accesseurs : automatique mais (trop ?) compliqué à configurer et utiliser… De plus, a priori, cela ne peut générer des getters/setters pour un attribut rajouté après coup

Si vous ne savez pas (encore) installer un plugin Eclipse, allons donc faire un tour sur ce billet : Let’s work OSGi Virgo on Eclipse.

Bref… il n’existe pas de solutions idéales à l’heure actuelle et c’est bien dommage ! Alors qu’en Java il est possible de faire clic droit > Source > Generate get/set ou Generate toString… Ce sont toutes ces choses qui font que développer en PHP Objet sous Eclipse n’est pas encore aussi facile que de développer en Java.

Récapitulatif PHP Objet

Publié dans PHP objet | Laisser un commentaire

Logo PHP

Ce billet vient récapituler la série sur PHP Objet que j’ai effectuée entre mai à juillet 2009. Le but est de faire le point sur PHP Objet, sur mes connaissances et sur les publications réalisés à ce sujet sur 30minparjour. Désormais, j’essayerai de faire un tel résumé pour toutes les séries que j’aborderai. C’est long et fastidieux, mais je pense que cela m’est utile pour faire le point. J’espère que cela vous servira aussi.

Résumons quelques points importants

Petit résumé sur les classes

[abstract ]class MaClasse [extends AutreClasse implements Interface]
{
	public|protected|private [static] $maVariable [= valeur];
	public static $etat = 1;
	
	/**
	 * Constructeur
	*/
	public|protected|private function MaClass|__construct()
	{
		// Déclaration des variables et autres
	}
	
	/**
	 * Fonction classique
	*/
	public|protected|private [static final abstract] function maMethode()
	{
		// Action de la fonction maMethode
		$this--->maVariable = 'test';
		self::$etat = 0;
		$this->autreMethode();
		[parent::autreMethode();]
	}
	public function $autreMethode()
	{
		echo 'Hello world!';
	}
}

Au passage, je rappelle qu’une classe peut implémenter plusieurs interfaces, mais ne peut hériter que d’une seule classe.

Petit résumé sur les interfaces

interface Interface [extends AutreInterface]
{
	/**
	 * Fonction classique
	*/
	public function $maMethode();
	/**
	 * Autre fonction classique
	*/
	public function $autreMethode();
}

Petit résumé sur les singletons

class Singleton
{
	/**
	 * Variable static valant null si la classe n'est pas encore instanciée
	 * ou contenant l'instance si la classe est instanciée.
	 * On y accède avec self::$_instance
	*/
	private static $_instance = null;
	
	/**
	 * Constructeur private inaccessible en dehors de la classe
	*/
	private function __construct()
	{
		// On instancie ce qu'il faut
	}
	
	/**
	 * Accessor static, donc accessible sans être instancié, renvoyant 
	 * l'instance, en la créant si besoin
	*/
	public static function getInstance()
	{
		if (self::$_instance == null) {
			self::$_instance = new Singleton();
		}
		return self::$_instance;
	}
}

Quelques méthodes magiques utiles

  • __construct() : Appelée lorsqu’on tente de construire la class
  • __destruct() : Appelée lorsqu’on tente de détruire la class
  • __set() : Déclenchée lors de l’accès en écriture à une propriété de l’objet. Exemple d’utilisation
  • __get() : Déclenchée lors de l’accès en lecture à une propriété de l’objet. Exemple d’utilisation
  • __call() : Déclenchée lors de l’appel d’une méthode inexistante de la classe (appel non static). Exemple d’utilisation
  • __callstatic() : Déclenchée lors de l’appel d’une méthode inexistante de la classe (appel static) : disponible depuis PHP 5.3 et 6.0
  • __isset() : Déclenchée si on applique isset() à une propriété de l’objet
  • __unset() : Déclenchée si on applique unset() à une propriété de l’objet -> différence avec __destruct() ?
  • __sleep() : Exécutée si la fonction serialize() est appliquée à l’objet. Exemple d’utilisation
  • __wakeup() : Exécutée si la fonction unserialize() est appliquée à l’objet. Exemple d’utilisation
  • __toString() : Appelée lorsque l’on essaie d’afficher directement l’objet : echo $object;
  • __clone() : Appelé lorsque l’on essaie de cloner l’objet. Exemple d’utilisation

Conclusion

Je crois qu’on vient de faire un tour vraiment rapide mais plus ou moins complet du PHP Objet. A mon sens, il manque 3 notions à ce résumé (mais on ne peut pas tout résumer) :

  • Les exceptions. Il faudrait que je m’y mette un jour. Heureusement il existe un très bon tutoriel sur « Apprendre PHP » : Les exceptions.
  • Un autre chose plutôt cool qu’aborde « Apprendre PHP » est l’interface Iterator, quoi que je ne vois pas trop l’interêt en PHP, mais je sais combien c’est cool en Java !
  • La copie d’une classe. Je l’ai quand même vraiment pas mal résumé ici : Le clônage n’est pas une référence.

Billets traitant de PHP Objet

J’ai trié et classé toutes les publications que j’ai fait sur ce blog à propos du PHP Objet.

Apprentissage

Application

Trucs et astuces

Documentation et tutoriels

Je vous présente les quelques sites que j’ai fréquemment utilisé pour comprendre le fonctionnement et les finesses de PHP et du PHP orienté objet.

Singleton(s) !

Publié dans PHP objet | Commentaires fermés sur Singleton(s) !

Voilà bien longtemps que je n’avais pas fait de billets sur le PHP Objet. A vrai dire, je suis en train d’apprendre la programmation orientée objet en cours (au travers du Java et du C++), donc ça fixe vraiment les idées et permet de comprendre pas mal de petites choses, notamment l’utilité de certaines notions, comme les singletons, qui me paraissait bien douteuse auparavant. Un singleton, c’est une classe que l’on ne peut instancier qu’une seule fois. Par exemple, en cours on a créé une classe liste dont hérite la classe liste vide, et la classe listeNonVide. Clairement, il n’existe qu’une et une seule liste vide (sinon, on ne s’en sort pas), donc cette classe ne peut être instanciée qu’une seule fois, donc c’est un singleton. Je n’ai pas encore trouvé d’exemples plus parlant, par contre sur Apprendre-PHP, l’exemple est celui d’une classe PresidentDeLaRepublique qui, en effet, ne peut être instanciée qu’une seule fois)

Comment faire ?

L’idée est la suivante : le constructeur de la classe est private, on ne peut donc instancier la classe en passant directement par lui. Par contre, une variable static possède un accessor (getMachin()) qui est public et qui appelle le constructeur si la classe n’est pas encore instanciée (variable static == null), ou retourne l’instance sinon. En somme, voilà ce que ça donne :
Continuer la lecture

Classes abstraites et finales

Publié dans PHP objet | 2 commentaires

Les notions de classes abstraites et classes finales permettent de sécuriser notre programmation PHP, dans le sens qu’elles permettent d’éviter qu’un programmeur, reprenant notre code, n’en contourne la logique et s’égare ainsi sur une fausse piste.
En effet :

  • Class abstraite : class qui ne peut être instanciée, il est donc OBLIGATOIRE de créer une class héritante de cette class pour s’en servir. Utile lorsque l’on créé une class générique qui ne servira qu’à créer des sous class et non à être instanciée. Une telle class ne contient donc pas de __construct() puisqu’elle n’est pas instanciée. Mot clef : abstract.
  • Class finale : class qui NE PEUT PLUS avoir de sous-class, c’est-à-dire de class héritante. Les méthodes de cette class ne pourront être surchargées (réécrites, redéfinies). Mot clef : final. De la même manière, on peut aussi déclarer des méthodes abstraites et finales.
  • Méthode abstraite : méthode qui doit OBLIGATOIREMENT être surchargée (réécrite, ou redéfinie). Une class contenant une méthode abstraite doit aussi être abstraite. Mot clef : abstract.
  • Méthode finale : méthode qui NE PEUT ÊTRE surchargée (réécrite, redéfinie). Une class finale s’applique sur toutes les méthodes ou attributs de la classe, alors qu’ici on ne touche qu’à une seule méthode. Mot clef : final. Pour bien comprendre ces 2 notions et en saisir mieux l’intérêt voici plusieurs exemples, un pour chaque cas.

Class et méthodes abstraites

 abstract class Site {
	protected $type;
	protected $name;
	public function getType()
	{
		return $this->type;
	}
	public function getName()
	{
		return $this->name;
	}
}
$monSite = new Site();
echo $monSite->getType(); // Erreur : on tente d'instancier une classe abstraite

Continuer la lecture

Quelques méthodes et constantes magiques ou prédéfinies

Publié dans PHP objet | Laisser un commentaire

Attributs ou méthodes qui n’existent pas ?

Avant de faire un petit récapitulatif magique ou déjà défini (mouahaha), voyons une petite notion importante du PHP objet : il est possible de modifier et de lire la valeur d’un attribut qui n’existe pas (ah horreur), par contre, on ne peut utiliser une méthode qui n’existe pas (ah bah ça tombe bien alors !). Je m’explique en codant :

class Chat { }
$unChat = new Chat();
$unChat->couleur = 'noir';
$unChat->etat = 'sorti ses griffes';
echo 'Mon chat '.$unChat->couleur.' a '.$unChat->etat.'.';

Eh oui, ce petit exemple affichera bien : « Mon chat noir a sorti ses griffes . ». C’est horrible, n’est-ce-pas ? Heureusement avec __set() et __get(), on va pouvoir empêcher ce types d’actions et en profiter pour vérifier le type des valeurs que l’on assigne à nos attributs.
Par contre :

class Chat { } 
$unChat = new Chat();
$unChat->etreGentils();

Nous renverra une jolie petite erreur ! (heu, oui, je n’aime pas tellement les chats. Enfin, cela dit, je n’ai rien contre eux non plus) Heureusement la méthode magique __call() va nous permettre de rattraper ce petit bémol. Mais tout cela est très bien expliqué sur Apprendre PHP, alors sans plus tarder voilà une liste des méthodes et des constantes magiques, ainsi que des fonctions prédéfinies avec à chaque fois une explique, ou des exemples tiré du manuel PHP, de tutoriels sur le Web ou de mes propres mot.
Continuer la lecture

Vocabulaire à connaître de la POO

Publié dans PHP objet | 2 commentaires

Voici quelques mots de vocabulaire qu’il peut être utile de connaître pour s’y retrouver en programmation orientée objet. Je complèterai cette liste au fil du temps. (en fonction de mes souvenirs et de mes découvertes)

  • Classe : Permet de définir la structure d’un objet qui pourra ensuite être utilisé plusieurs fois avec des options différentes, et dupliqué à loisir par le biais de classes filles. Mot clef : class
  • Instance : Une classe définie et chargée. Une instance (un objet) est donc utilisable concrètement, alors qu’une classe. Mot clef : new
  • Objet : Instance d’une classe
  • Attribut ou Propriété : Variable d’une classe. Mot clefs : var ou const
  • Méthode : Fonction d’une classe. Mot clefs : function
  • Surcharge ou polymorphisme Ad hoc : Permet de définir des méthodes avec le même nom et ayant des fonctionnalités similaires (ex : afficher(), supprimer()) dans des classes héritant d’une même classe mais n’ayant pas d’autres liens entres elles. On parle ainsi de surcharge d’une méthode lorsque l’on redéfinie une méthode qui avait déjà été définie dans une classe parente. Ex : fonction trier() qui fonctionnera pour trier des livres ou des CD sans que le programmeur se souci du nom de la méthode.
  • Attribut ou méthode magique : Attribut ou méthode commençant généralement par deux underscores (__) , étant apparu dans PHP 5, et ayant des fonctionnalités impossible à coder « à la main » comme par exemple le déclenchement d’une méthode lors de l’instanciation d’une classe ou la suppression d’une instance. Ex : __construct, __clone, __toString
  • Méthode prédéfinie : Méthode déjà définie par PHP. Ex : get_parent_class, class_exists
  • Héritage : Notion permettant qu’une classe (dites fille) hérite des attributs et des méthodes d’une autre classe (dites parente). Mot clef : extends
  • Constructeur : Méthode permettant de créer un objet en instanciant une classe. Mot Clef : __construct($params)
  • Interface : Définie une liste de méthodes que doit contenir les classes qui implémentent cette interface. Mot clef : interface

Pour se fixer les idées sur self et this

Publié dans PHP objet | Un commentaire

Voici un petit exemple pour bien comprendre ce qui se passe lorsque l’on utilise self ou $this, avec des attributs static ou non :

<?php
class DitBonjour {
	public static $fr = 'Coucou le monde !';
	public static $de = 'Guten tag!';
	public $en = 'Hello world!';
	public $es = 'Buenos dias!';
	function saluer()
	{
		echo '<strong>1. Public, static, direct :</strong> '.$this->de.'<br />';
		echo '<strong>2. Public, static, self :</strong> '.self::$fr.'<br />';
		echo '<strong>3. Public, direct :</strong> '.$this->en.'<br />';
		echo '<strong>4. Public, self :</strong> '.self::$es.'<br />';
	}
}
$appel = new DitBonjour();
$appel->saluer();
?>

Ce qui renvoie :

Notice: Undefined property: DitBonjour::$de in F:\bn\Web\Test\PHPObjet\test2.php on line 13
1. Protected, static, direct :
2. Protected, static, self : Coucou le monde !
3. Public, direct : Hello world!
Fatal error: Access to undeclared static property: DitBonjour::$es in F:\bn\Web\Test\PHPObjet\test2.php on line 16

Moralité

  • On ne peut accéder à un attribut static qu’avec self (ou parent, ou NomClass)
  • On ne peut accéder à un attribut non static avec self, on y accède avec $this

Utiliser les méthodes et les attributs d’une autre class

Publié dans PHP objet | Laisser un commentaire

Ah, je viens enfin de mieux comprendre à quoi servait l’opérateur cons ::. Dans le précédent billet où j’en parlais je disais qu’il permet de résoudre un attribut ou une méthode, éh bien c’est tout à fait vrai !

  • Pour appeler un attribut ou une méthode d’une class dans cette même class, on utilise $this->methodeOuAttribut.
  • Pour appeler un attribut ou une méthode d’une class lorsqu’on a instancié cette class, on utilise $nomInstance->methodeOuAttribut.
  • Pour appeler un attribut ou une méthode d’une class dans une autre class, on utilise NomDeLaClass::methodeOuAttribut. Les deux class doivent bien sûr se trouver dans le même fichier, ou on peut inclure l’une dans le fichier de l’autre avec include() ou require().

Dans le cas d’un attribut, si l’on tente d’y accéder avec le nom d’une class, cela signifie que notre attribut doit être static, il reste identique pour toutes les instances de cette class.
Prêt pour un petit exemple (débile) ?

<?php
class DitBonjour {
	protected static $fr = 'Coucou le monde !';
	public static $en = 'Hello world!';
	public static $de = 'Guten tag!';
	function saluer()
	{
		return 'Guten tag!'.'<br />';
	}
	function saluer_en_langue($langue)
	{
		return $langue;
	}
	function fr()
	{
		return self::$fr;
	}
	function de()
	{
		return $this->de;
	}
}

class Appeler {
	function dire_bonjour()
	{
		echo DitBonjour::saluer();
	}
	function dire_bonjour_en_langue()
	{
		echo DitBonjour::saluer_en_langue(DitBonjour::fr()).'<br />';
		echo DitBonjour::saluer_en_langue(DitBonjour::$en).'<br />';
		echo DitBonjour::saluer_en_langue(DitBonjour::de()).'<br />';
	}
}

$appel = new Appeler();
$appel->dire_bonjour();
$appel->dire_bonjour_en_langue();

Ceci renverra :

Guten tag!
Coucou le monde !
Hello world!
Notice: Undefined property: Appeler::$de in F:\bn\Web\Test\PHPObjet\test2.php on line 26

Continuer la lecture

Traduction instantannée avec BabelFish

Publié dans PHP objet | Un commentaire

Parce qu’il faut bien mettre un petit peu en pratique de temps en temps, je me suis amusé à créer une class qui implémente un module de traduction à l’aide de BabelFish (le système de traduction de Yahoo). En résumé, j’ai plusieurs attributs qui déterminent les différents paramètres de la classe (url de la page de retour, url de BabelFish, langue du message à traduire, langue de la traduction), le constructeur permet de définir ces deux derniers, puisque ce sont les seules succeptible de changer assez souvent ! (pour pouvoir faire du Espagnol -> Anglais ou Grec -> Chinois) L’url pour traduire une phrase avec BabelFish se décompose de la manière suivante :

  • http://fr.babelfish.yahoo.com/translate_txt : base de l’url
  • lp : langues à utiliser (ex : fr_en)
  • trtext : chaine de caractères à traduire. Les caractères accentués sont bien traités, mais les guillements et les espaces posent un problème. Il faut remplacer les espaces par des + ou des %20, quant aux guillemets, bah je n’arrive pas à savoir par quoi il fut les transformer, donc pour l’instant je bloque.

Et voilà, il n’y a plus qu’à faire un petit file_get_contents pour récupérer la page chargée par cet url, et une petite regex pour ne récupérer que la traduction : et le tour est joué !
Continuer la lecture

Un objet en sortie d’une requête Mysql

Publié dans PHP objet | Laisser un commentaire

Parfois, on peut être un peu mordu de PHP objet, et au lieu de vouloir un array associatif (le nom du champ comme clé : mysql_fetch_assoc), ou un array indexé numériquement (un numéro comme clé : mysql_fetch_row -> le plus rapide), on veut un objet « associatif » (le nom des champs comme attribut) grâce à mysql_fetch_object. C’est tout aussi rapide que mysql_fetch_assoc ou mysql_fetch_array, un peu moins que mysql_fetch_row (quand même) mais ça peut être utile.
Le manuel PHP nous dit : mysql_fetch_object() retourne un tableau qui contient la ligne demandée dans le résultat result et déplace le pointeur de données interne d’un cran.
Voici un exemple d’utilisation (tiré du manuel PHP) avec matable(user_id, user_name, user_age) que voici :

user_id | user_name | user_age
   1       Fylhan	NULL
   2        BN	         18
<?php
// Connexion à la BDD
mysql_connect('serveur', 'utilisateur', 'mdp');
mysql_select_db('nombdd');
// Exécution de la requête
$result = mysql_query('select * from matable');
if (mysql_num_rows($result) == 0)
  echo 'Aucun résultat.';
else {
  // Boucle sur les champs (chaque champ étant renvoyé en tant qu'objet)
  while ($row = mysql_fetch_object($result))) {
    echo $row->user_id.' ';
    echo $row->user_name.'<br />';
  }
}
// Libération de la mémoire 
mysql_free_result($result);

Ceci renverra :

1 Fylhan
2 BN

Continuer la lecture