PHP

Un langage en évolution

Pascal MARTIN, http://blog.pascal-martin.fr / pmartin@php.net / @pascal_martin

Appuyez sur [s] pour ouvrir les notes présentateur dans une nouvelle fenêtre.

Un peu d'histoire

PHP Tools

Suite d'outils créée par Rasmus Lerdorf

  • 1994 : binaires CGI écrits en C
    • Personal Home Page Tools
    • Interraction base de données
    • Applications dynamiques web !
  • Juin 1995 : diffusion sources
  • Septembre 1995 : Forms Interpreter
    • Variables,
    • Formulaires,
    • Syntaxe s'intégrant au HTML

Rasmus Lerdorf

Rasmus Lerdorf

Photo par Arnaud Limbourg sur Flickr, CC-BY/NC/SA.

PHP/FI 2

1996 - 1997

  • Langage de programmation
  • Orientation Web forte
    • Bases de données,
    • Cookies,
    • Formulaires,
    • Fonctions définies par l'utilisateur, ...
  • Mai 1998 : 60,000 domaines
  • 1 seul développeur

PHP/FI 2


<select>
    <?$result = msql($database,"select name from categories where name<>'$category' order by name")>
    <?$i=0>
    <?$num = msql_numrows($result)>
    <?while($i<$num)>
        <option><?echo msql_result($result,$i,"name")>
    <?$i++>
    <?endwhile>
</select>
                    

PHP: Hypertext Preprocessor

1997 - 1998

  • Ré-écriture complète par Zeev Suraski et Andi Gutmans
    • Nouveau langage,
    • Nouveau nom,
    • Extensible (modules en C),
    • Non limité à POSIX.
  • Juin 1998 : PHP 3.0
  • Jusqu'à 10% des serveurs web d'Internet

Zend Engine

2000 - aujourd'hui

  • PHP 4 : mai 2000
  • PHP 5 : juillet 2004
    • Versions stables : PHP 5.4, 5.5
    • Version "old-stable" : PHP 5.3
  • 81% des sites web (W³Techs)

elePHPants walking through the light

Photo par Jakob Westhoff sur Flickr, CC-BY/NC/SA.

Quelques
fonctionnalités
de PHP

Langage de templates

  • 1er rôle de PHP
  • HTML / PHP
  • Code entre <?php et ?>
  • Typage souple

<?php
$who = "World";
?>

<p>
    Hello, <strong><?php echo $who; ?></strong>!
</p>
                    

Langage procédural

  • API historiquement basée sur des fonctions
    • Plusieurs milliers !
    • Encapsulation de fonctions C
    • Manipulation de chaînes, tableaux, fichiers, ...
    • Accès DB, réseau, images, ...
  • Fonctions définies par l'utilisateur

<?php
function say_hello($who) {
    echo sprintf("Hello, %s!", ucfirst($who));
}
?>
<p>
    <?php say_hello('lyon'); ?>
</>
                    

Langage objet

PHP 5 : fonctionnalités "objet"

  • Classes / propriétés / constantes / méthodes
  • Visibilités, Héritage
  • Constructeur / destructeur, méthodes magiques
  • Classes abstraites, interfaces
  • Exceptions

Un exemple de classe


<?php
class MyClass {
    private $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
    
    public function getHello() {
        return sprintf("Hello, %s!", $this->name);
    }
}

$obj = new MyClass("World");
echo $obj->getHello();
                    

Langage objet

Quelques méthodes magiques


<?php
class MyClass {
    protected $data;
    public function __set($name, $value) {
        $this->data[$name] = $value;
    }
    public function __get($name) {
        return isset($this->data[$name]) ? $this->data[$name] : "mahnah mahnah";
    }
    public function __call($method) {
        // Comme si on avait appelé ->nomDeMethode()
    }
}

$obj = new MyClass();
$obj->plop = 123456;
$obj->ahha = "Hello";
printf("plop:%d\nahha:%s\ntoto:%s\n", $obj->plop, $obj->ahha, $obj->toto);
                    

plop:123456
ahha:Hello
toto:mahnah mahnah
                    

Exceptions


<?php
$db = new MaDatabase($dsn, $user, $password);
try {
    $db->beginTransaction();
    $db->query(" ... ");
    $db->query(" ... ");
    $db->commit();
}
catch (DatabaseException $e) {
    $db->rollback();
}
catch (Exception $e) {
    // faire quelque chose
}
finally {
    $db->close();
}
                    

Quelques highlights

Evolutions des dernières versions de PHP

  • Espaces de noms
  • Fonctions anonymes / closures
  • Traits
  • Serveur web de test
  • Générateurs

Espaces de noms


<?php
namespace Mon\Espace\De\Noms;

class MaClasse {
    public function maMethode() {
        echo __METHOD__ . "\n";
    }
}
                    

<?php
require __DIR__ . '/example-namespace-01.php';

use Mon\Espace\De\Noms\MaClasse;

$obj = new MaClasse();
$obj->maMethode();
                    

Fonction anonyme


<?php
$data = [ "bonjour", "hello", ];

$result = array_map(
    function ($item) {
        return ucfirst(str_rot13($item));
    },
    $data
);

var_dump($result);
                    

array(2) {
  [0] =>
  string(7) "Obawbhe"
  [1] =>
  string(5) "Uryyb"
}
                    

Closure


<?php
$maker = function ($paramMaker) {
    $paramMaker *= 5;
    return function ($who) use ($paramMaker) {
        printf("Hello, %s (%s)\n", $who, $paramMaker);
    };
};

$function_1 = $maker(11);
$function_2 = $maker(22);

$function_1("World");
$function_2("Lyon");
                    

Hello, World (55)
Hello, Lyon (110)
                    

Trait (PHP 5.4)

Réutilisation horizontale


<?php
trait MonTrait {
    protected $logger;
    public function setLogger(LoggerInterface $logger) {
        $this->logger = $logger;
    }
    public function getLogger() {
        return $this->logger;
    }
}
                    

<?php
class MaClasse {
    use MonTrait;
    
    public function maMethode() {
        $this->getLogger()->log("Hello, logger !");
    }
}

$obj = new MaClasse();
$obj->setLogger(new UnLogger());
$obj->maMethode();
                    

Trait (PHP 5.4)

Classe + Interface de l'exemple précédent


<?php
interface LoggerInterface {
    public function log($str);
}

class UnLogger implements LoggerInterface {
    public function log($str) {
        printf("[%s] %s\n", date('H:i:s'), $str);
    }
}
                    

Générateur (PHP 5.5)


<?php
$generator = function ($path) {
    $file = fopen($path, 'r');
    while (!feof($file)) {
        yield trim(fgets($file));
    }
    fclose($file);
};

$iterator = $generator(__DIR__ . '/exemple.txt');
foreach ($iterator as $val) {
    echo $val, "\n";
}
                    

Quelques moins bonnes choses

Tout n'est pas parfait ; beaucoup d'historique

  • Volonté d'assurer la rétro-compatibilité
  • register_globals, magic_quotes (supprimées !)
  • Extensions / fonctionnalités obsolètes
  • API parfois peu consistante
  • Manque de support complet d'Unicode
  • goto

goto
Goto par XKCD, CC-BY/NC.

Une bande de voleurs !

Des idées reprises d'ailleurs ;-)

  • Syntaxe : Bash, C, Perl, ...
  • Modèle objet : JAVA
  • Fonctions anonymes : Javascript
  • Traits : Ruby
  • Generators : Python

Un langage
qui s'est
professionnalisé

Des points de rencontre

3 gus sur usenet

  • AFUP : + de 10 ans, antennes locales
  • Conférences : Forum PHP / PHPTour ; ZendCon, International PHP Conference, Confoo, SunshinePHP, ...
  • Apéros PHP / conférences "locales"

Des plate-formes logicielles

PHP, fondation de plate-formes OSS

  • E-commerce : Magento, Prestashop, ...
  • CMS : Wordpress, Drupal, Joomla, Mediawiki, ...
  • Outils / communautés qui s'ouvrent
    • eZPublish, Drupal : symfony2

Large base de développeurs / installations

Des utilisateurs "connus"

  • M6Web, e-TF1,
  • Euronews, 20minutes, Le Monde Interactif,
  • France.fr, whitehouse.gov,
  • Editeurs

PHP est souvent arrivé "par la petite porte"

Des outils qui murissent

  • Frameworks de seconde génération
  • Framework Interop Group
  • Gestion de dépendances facilitée : Composer
  • Bonnes pratiques

Au niveau de PHP lui-même ?

Une visions ?

PHP, un langage...

  • De templating,
  • Accessible aux "débutants",
  • Accessible aux "amateurs", / "bidouilleurs",
  • Orienté "professionnel" / "entreprise".

Quelques liens

Questions ?

#AperoPHP

I hope the elePHPant is over age

Photo par Elliott White III sur Flickr, CC-BY/NC/SA.

#AperoPHP

PHP, Perl, Python, ASP et Java sont dans un bateau, ...

@lea_linux le 17 sept. 2013

Présentation PHP — AFUP Lyon, 25 septembre 2013 — Pascal MARTIN, @pascal_martin