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

2 méthodes pour personnaliser des extensions Web

Publié dans Apache | Laisser un commentaire

J’ai lu un billet l’autre jour sur Code 18 à propos de la personnalisation des extensions Web, et je trouvais que ça allait bien avec ce dont j’ai déjà parlé à propos de l’Url Rewriting. Par exemple, si jamais j’avais envie de créer des fichiers .bn pour faire genre j’ai créé un langage s’appelant « BN » (héhé) mais sans créer ce langage (parce que hein), en utilisant le langage PHP par exemple. Eh bien il me suffit de dire à Apache (ou équivalent) d’interpréter les pages .bn comme des pages .php. Pour cela, je n’ai qu’à ajouter une ligne au .htaccess ou au fichier httpd.conf d’Apache :

AddType application/x-httpd-php .bn

Et je suppose qu’on peut faire de même avec httpd-html… A tester. Bon, vous me direz, on peut obtenir le même effet en créant normalement des pages .php et en utilisant l’Url Rewriting pour créer des pages virtuelles .bn qui redirigent vers les pages .php

RewriteRule ^([a-z,A-Z,0-9,\-]+).bn$ $1.php [L]

Et voilà le travail ! C’est cette dernière méthode que j’avais utilisé sur la Bnbox pour créer des pages .cahier, .atelier, … Je trouvais ça fun à l’époque, mais aujourd’hui je regrette un peu 😀

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

L’url rewriting c’est le bien

Publié dans Apache | Laisser un commentaire

L’url rewriting, cette technique qui consiste à créer des pages virtuelles avec un url tout mignon et qui redirige vers de vraies pages avec un url tout moche, est particulièrement intéressante pour 2 raisons :

  • Se faire bien voir des moteurs de recherches. L’url est très utilisé par les robots d’indexation, par conséquent, si elle contient déjà des mots clefs importants, c’est tout bon !
  • Améliorer l’expérience de ses visiteurs. En effet, on est plus enclin à cliquer sur un lien http://exemple.fr/presentation-url-rewriting.html que sur http://exemple.fr/index.php?id=1254879, tout simplement parce que l’on sait, a priori, de quoi est censé parler la page sur lequel on va se diriger.

Pour réécrire ses urls, il suffit de créer un fichier .htaccess à la racine de son serveur et d’y écrire quelques lignes pour expliquer à Apache comment rediriger certaines pages. Quelques connaissances en expressions régulières peuvent servir ! Et il faut que le mode url-rewriting de votre serveur Apache soit activé. (ce qui n’est pas le cas partout, mais il y a des techniques pour réécrire quand même ses urls, notamment sur un serveur hébergé par Free) Et ce fichier .htaccess peut ressembler à ça :

RewriteEngine on RewriteBase /site/front ################################################################################
#
# REDIRECTION DES PAGES VIRTUELLES RATTACHEES A DES RUBRIQUES : 
#
#	Exemple de redirection: scooter-rouge_15.php => index.php?id=15 
#
#	PS: 1.	Le - (tiret) sert à séparer les mots dans un nom de page
#		Le _ (underscore) sert à distinguer la page de la rubrique.
#		Exemple: scooter-rouge-08_15.php OU scooter-rouge-fiche_15.php
#
#            2.	Sur certain serveur d'hebergement, il faut forcer l'ajout de "/"
#		devant la 2éme partie des régles: /index.php?id=$2 [L]
#
# Solution : tester avec la règle située à la fin de ce fichier
# ################################################################################
# Règles pour l'affichage des pages articles
RewriteRule ^([a-z,A-Z,0-9,\-]+).html$ index.php?RID=10&kw=$1 [L]

Cela étant dit, je pense que la meilleur manière de réécrire des urls est d’utiliser le titre de la page et seulement le titre de la page. Je m’explique en prenant comme exemple une page index.php?id=42 qui a pour titre (titre de la page, ou titre d’un article) « Hello Word! » :

  • La méthode la plus courante est d’utiliser la forme suivante : hello-world_42.html. C’est déjà pas mal, et c’est même plus que bien ! C’est de loin ce qu’il y a de plus simple aussi.
  • La méthode la plus performante mais légèrement plus délicate à mettre en place est d’utiliser la forme qui suit : hello-world.html. Pour la mettre en place, il suffit d’enregistrer le titre rewrité de chacune de ses pages dans sa base de données. Ces titres rewrités remplacent alors les id des pages. Et puis voilà, le tour est joué ! Bien sûr, pour éviter que 2 pages ayant un titre identique pointent vers le même lien, il est nécessaire que la fonction de rewritage du titre se charge de vérifier que ce dernier n’existe pas encore, et si ce n’était pas le cas, de lui ajouter un id ou je ne sais quoi. Bref, l’idée est là ! Et tant qu’à faire, cette fonction de parsage se chargera de supprimer ou de remplacer les caractères accentués, les majuscules, les espaces, les mots de moins de 2 ou 3 lettres (sauf cas particuliers), … Un truc qui ne garde que les mots clefs réellement important quoi.

Bon, sur ce, je retourne rewrité des pages !

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

Pagination (aussi) en haut de pages sous Dotclear

Publié dans Dotclear | Laisser un commentaire

Comment copier le bloc de pagination (Ex : « billets précédents – page 2 de 6 – billets suivants ») se trouvant en bas de la page d’accueil d’un blog Dotclear afin de la placer aussi en haut de cette page d’accueil ? Rendez-vous dans l’éditeur de thème (Tableau de bord > Apparence du blog > Blog à modifier > Éditeur de thème) de la partie d’administration.
Le fichier à modifier est home.html, il faut ajouter les lignes suivantes juste après :

<tpl:EntriesHeader>
   <tpl:Pagination>
     <p class="pagination">
       <tpl:PaginationIf end="0"><a href="{{tpl:PaginationURL offset="+1"}}" class="prev">{{tpl:lang previous entries}}</a> - </tpl:PaginationIf>
       {{tpl:lang page}} {{tpl:PaginationCurrent}} {{tpl:lang of}} {{tpl:PaginationCounter}}
       <tpl:PaginationIf start="0"> - <a href="{{tpl:PaginationURL offset="-1"}}" class="next">{{tpl:lang next entries}}</a></tpl:PaginationIf>
     </p>
   </tpl:Pagination>
</tpl:EntriesHeader>

En fait, j’ai juste recopier le bloc de pagination se trouvant en bas de page en transformant Footer par Header. Et voilà le travail ! Je trouvais qu’il était plus agréable de savoir en un coup d’œil sur quel page du blog on se trouve, voir d’en changer rapidement si on en cherche une en particulier. Bon, quelque chose du style « billets précédents – 1.2…4.5 – billets suivants » serait plus utile à mon gout, mais ce sera pour une autre fois ^^
Au passage, et si vous voulez vous faire la main en douceur avec l’éditeur de thème, je vous conseille le plugin Billet Connexe qui permet d’afficher une liste de billets précédents/suivants/aléatoires/connexes à la fin d’un billet.

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

La visibilité tu vois…

Publié dans PHP objet | Laisser un commentaire

Je viens de découvrir un nouveau tutoriel sur la POO en PHP sur le site Apprendre PHP. Le site est bien joli, et le tutoriel est bien expliqué. L’auteur s’est donné la peine de donner de nombreux exemples, et c’est ce qui rend ce tutoriel encore plus intéressant à mon sens.
Dans un précédent billet, j’avais expliqué l’utilisation des mots clés private, protected et private, mais avec ce tutoriel, je viens d’apprendre que cette notion s’appelle la visibilité d’attributs ou de méthodes.

Petit rappel sur la visibilité

  • public (valeur par défaut) : l’attribut ou la méthode ainsi défini pourra être utilisé par n’importe qui.
  • protected : l’attribut ou la méthode ainsi défini ne pourra être utilisé que dans la class parente et ses dérivées (bref, celles qui en héritent quoi).
  • private : l’attribut ou la méthode ainsi défini ne pourra être utilisé que dans la class parente.

Un petit exemple d’utilisation :

class MaClass {
  public $var1;
  public function fonction()
  {
    echo 'Coucou';
  }
}

Et une petite erreur renvoyé si on utilise un attribut ou une méthode protégée ou privée à mauvaise escient : Fatal error: Cannot access private property NomClass::$attribut in /path/to/Apprendre-php/magic_methods.php on line X.
Continuer la lecture