Archives de catégorie : PHP

Le PHP (PHP: Hypertext Preprocessor) est un langage de scripts libre principalement utilisé pour produire des pages Web dynamiques via un serveur HTTP, mais pouvant également fonctionner comme n’importe quel langage interprété de façon locale, en exécutant les programmes en ligne de commande. PHP est un langage impératif disposant depuis la version 5 de fonctionnalités de modèle objet complètes. En raison de la richesse de sa bibliothèque, on désigne parfois PHP comme une plate-forme plus qu’un simple langage.
Le PHP est un langage que j’utilise assez souvent et il m’arrive donc de découvrir de nouvelles choses à son sujet. Du coup, rien de tel pour se fixer les idées que d’essayer de résumer ça dans un billet.

Javascript

Manipuler du JSON en PHP

Publié dans PHP | Un commentaire

Pour manipuler du JSON en PHP, il y a 2-3 petites choses à savoir. L’encodage, décodage c’est la première étape. Ensuite on peut s’amuser à gérer des cas bizarres et les erreurs. Et après… après on peut s’amuser avec des schémas si jamais l’envie nous prend.

Encodage / Décodage

Tout d’abord, les méthodes qui font l’essentiel du travail :

  • json_decode: transforme une chaîne de caractères JSON en variable PHP
  • json_encode: transforme une variable PHP en chaîne de caractères JSON

Cependant, il faut garder en tête que ces méthodes ne travaillent qu’avec de l’UTF-8. Allez savoir pourquoi alors que c’est plutôt l’inverse en PHP généralement… mais bref. Du coup, un petit coup de utf8_encode / utf8_decode avant d’utiliser json_decode sur autre chose que de l’UTF-8. Même topo pour json_encode.
La documentation PHP nous fournit quelques autres informations intéressantes, par exemple au sujet de la manière d’accéder à un objet contenant un trait d’union en PHP ($myObject->{'param-etre'}).
Continuer la lecture

PHP diff et merge

Publié dans PHP | Un commentaire

Une question que je me pose en ce moment… Comment, en PHP, comparer deux version d’un même texte et n’en faire plus qu’une contenant les différentes modifications. En gros: difference + merge. C’est ce qui est utilisé couramment dans les systèmes de Wiki (dont Wikipédia) et je vois quelques applications à cela qui pourraient être très sympathiques.
Après une petite recherche, voilà ce que je retiens de ce qui existe.

PHPDiff

Le projet PHPDiff est géré par Chris Boulton, sous licence BSD et accessible via Github: PHPDiff sur Github.
Ce projet m’intéresse particulièrement car un certain Xiphe a créé une interface Web dynamique (bref, en Javascript) pour choisir comment merger deux textes. Ce qui peut s’avérer utile en cas de conflit. C’est accessible en licence GPL sous Github: jQuery Merge for PHP Diff sur Github. La démo est vraiment bluffante : Démo jQuery Merge.
Continuer la lecture

To search a needle in a PHP haystack

Publié dans PHP | Laisser un commentaire

Vous connaissez l’expression « Chercher une aiguille dans une meule de foin » ? Figurez-vous qu’elle existe aussi en anglais « To search a needle in a haystack » ! Et vu que ça peut se traduire mot à mot, je soupçonne nos amis anglais de nous l’avoir piqué… Oui, c’est gratuit 😉

Mais saviez-vous que cette expression existe aussi en PHP ?
Prenons l’exemple de la fonction in_array qui permet de vérifier l’existence d’un élément dans un tableau.

$haystack = array('cow', 'duck', 'pig');
$needle = 'cow';
if (in_array($needle, $haystack)) {
 echo 'Oh yeah!';
}
else {
 echo 'What?';
}

Et c’est la documentation PHP officielle qui utilise « needle » et « haystack » comme nom de variables !
Continuer la lecture

Plugin WiKiss pour protéger le wiki par un mot de passe

Publié dans PHP | Laisser un commentaire

Un plugin WikiBlaze (fork de Wikiss) bien fait comme il faut à l’arrache, afin de protéger son wiki par un mot de passe (le même que celui pour éditer des pages).

A améliorer absolument 😉

<?php # coding: utf-8

/** 
 * Privatize the Wiki with the password
 */
class Privatize
{
	public $description = "Privatize the wiki";
	
	function __toString() {
		return tr($description);
	}

	function formatBegin() {
		global $CONTENT;
		if (!authentified()) {
			$str = '<form action="" method="post"><label for="password">'.tr('Hé ! Le mot de passe !').'</label><br /><input type="password" name="sc" id="password" /><input type="submit" value="Ok" /></form>';
			die($str);
		}
		return TRUE;
	} // formatBegin
}

?>
Logo Eclipse

Automatically generate PHP get and set using Eclipse

Publié dans PHP | Laisser un commentaire

How to automatically generate PHP getter and setter using Eclipse? There are several possibilities, and no perfect one, but let’s try to list them all:

  • Using Eclipse templates: semi-automatic
    Window > Preferences > PHP > Editor > Templates -> New and use something like this:

    private $$${PropertyName};
    ${cursor}    
    public function get${PropertyName}() 
    {
      return $$this->${PropertyName};
    }
    
    public function set${PropertyName}($$value) 
    {
      $$this->${PropertyName} = $$value;
    }
    

    And then, to use this template type its name and press ctrl+space to generate this code. A context menu should also automatically appear when you type the name.

  • Use the Eclipse PDT plugin E-Surf: automatic, useful but not very clean and their is no way to configure it.
  • Use the Eclipse PDT PHPClassGenerator plugin by IBM to generate automatically classes and accessors: automatic but maybe to complex to configure and use. And it can’t generate getters / setters for attributes that have been added after the class creation.

If you don’t know yet how to install an Eclipse plugin: Let’s work OSGi Virgo on Eclipse (fr).

Humpf… At the moment, their is no perfect solution, and it is a shame! In Java, a simple right clic on a class > Source > Generate get/set or Generate toString… That is why developing in PHP on Eclipse is not yet as easy as developing in Java.

Symfony, Wamp 2.2 et l’extension PHP intl

Publié dans PHP | Un commentaire

Si vous obtenez des erreurs bizarres en utilisant PHP, notamment avec le framework Symfony, et plus particulièrement dans la gestion des formulaires, et d’autant plus si vous utilisez Wamp : c’est peut-être dû à l’extension intl.
Par exemple, une erreur 500 du type :

Catchable Fatal Error: Argument 1 passed to Symfony\Component\Form\Extension\Core\ChoiceList\MonthChoiceList::__construct() must be an instance of IntlDateFormatter, null given

Signifie peut-être que vous avez activé l’extension PHP intl ! Or, depuis PHP 5.3.0, cette extension est embarquée dans PHP. Auparavant il fallait installer / activer la version PECL de cette extension. Et visiblement, depuis Wamp 2.2, si on active la version PECL de php_intl, ça fait planter quelque chose… sûrement un doublon quelque part.
Conclusion : enlevez php_intl de votre fichier php.ini (ajoutez un point virgule devant cette ligne).

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.

Bien démarrer (autrement) avec Symfony2

Publié dans PHP | 2 commentaires

Pour peu que vous suiviez un petit peu l’actualité autour de PHP, vous avez sûrement entendu du framework Symfony ! Il faut dire que Symfony a vraiment la cote en ce moment, surtout depuis la sortie de sa version 2. Je réfléchis sérieusement en ce moment à me servir de ce framework pour mes divers projets. J’ai plusieurs idées en tête, et mes réflexions sont les suivantes :

  • je n’ai pas plus le temps de créer tout « à la main » comme j’aimerais pourtant le faire ;
  • je ne veux pas utiliser Joomla (beurk), j’ai peur de me mettre à Drupal, et WordPress bouffe définitivement trop de mémoire pour mon utilisation (et mon serveur mutualisé) ;
  • j’aimerai au moins avoir une structure me permettant de réutiliser facilement des blocs existants ou que j’ai moi même créé.

Le choix intermédiaire me paraît donc d’utiliser un framework PHP pas trop restrictif et performant. Et là il n’y a pas vraiment le choix : Symfony ou Zend. Mais Zend commence à avoir du plomb dans l’aile.

Le vrai but de ce billet est surtout de dire qu’il est possible d’apprendre à utiliser Symfony grâce à sa très bonne documentation : documentation Symfony. Mais que je préfère comprendre les concepts PHP / Web inhérents de ce framework, puis ensuite apprendre à le maîtriser. Et c’est possible ! Fabien Potencier (développer en chef de Symfony) fait actuellement une série intitulée Créer son propre framework à partir des composants de Symfony 2 ! Lecture très intéressante !

Bonne lecture 😉

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-&gt;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.

Montre mécanique

Transformer une date en langage naturel, en timestamp

Publié dans PHP | Laisser un commentaire

En ce moment, je m’amuse avec des flux RSS, et il se trouve que dans un flux RSS, on tombe souvent sur une date de la forme : « Fri Oct 30 17:17:00 2009 ». Bref, une date en langage naturel ! Mais voilà, ce dont j’ai besoin c’est d’une date au format timestamp (le nombre de secondes depuis le 1er janvier 1970 à minuit, aussi appelé l’epoch). Je pars donc avec mes grands sabots : des regex pour séparer heures, minutes, …, et un p’tit coup de mktime !
C’est pas mal, mais en fouillant dans la doc, j’ai trouvé une petite fonction fort sympathique : strtotime ! Cette fonction prend une chaine de caractères en argument et renvoie, si possible, le timestamp correspondant. Plusieurs mots clefs sont pris en compte, par exemple now, ou next Thursday. Et le format de date précédemment cité est bien reconnu, chouette, non ? Pour se convaincre :

$str = 'Mon Nov 2 07:01:11 2009';
$timestamp = strtotime($str);
$str2 = date('D M j H\:i\:s Y', $timestamp);
echo 'Date d\'origine : '.$str.'<br />Timestamp après strtotime : '.$timestamp.'<br />Date réécrite après strtotime : '.$str2;

Ce qui affiche bien :

Date d’origine : Mon Nov 2 07:01:11 2009
Timestamp après strtotime : 1257145271
Date réécrite après strtotime : Mon Nov 2 07:01:11 2009

Magique, non ?
Bon, je retourne à mes flux RSS.