Les derniers articles
Du procédural vers l'objet
Date :: 2005-04-02
Last Updated :: 2005-04-04
Introduction
Certaines extensions PHP5 comme mysqli, sqlite, sont utilisables de deux manières différentes, soit en utilisant un code procédural (ex: mysqli_connect()), soit en utilisant la POO (ex: $mysql -> connect()). Il pourrait s'avérer sympathique de pouvoir utiliser certaines extensions accessibles uniquement de manière procédurale, comme mysql, zip, curl en orienté objet. Le nommage uniforme des fonctions de ces extensions et un petit bout de code écrit en PHP5 vont nous permettre de réaliser cela assez simplement.
Exemple déjà existant
Prenons un exemple nativement implémenté dans PHP5, l'extension mysqli. En effet, cette extension peut être utilisée de deux manières différentes :
Code procédural
<?php
$link = mysqli_connect('localhost', 'root', 'password', 'base');
echo mysql_get_server_info();
mysql_close($link);
?>
Code orienté Objet
<?php
$mysqli = new mysqli('localhost', 'root', 'password', 'base');
echo $mysqli -> server_info;
$mysqli -> close();
?>
Classe de transformation
Voici donc comment nous allons procéder pour transformer des extensions procédurales en extension orientée Objet. Cette classe est assez simpliste, elle comporte uniquement deux méthodes membres :
- p2o :: __construct() : Constructeur de la classe. Il vérifie que l'extension passée en paramètre est bien chargée.
- p2o :: __call() : Cette méthode de PHP5 est automatiquement executée à chaque fois qu'une méthode non-existante est appellée, on s'en sert donc pour rediriger vers la bonne fonction procédurale.
class p2o {
private $extension;
public final function __construct($extension) {
$this->extension = $extension;
if(! extension_loaded($extension) ) {
die('bouh');
}
}
public function __call($method, $arguments) {
$m = $this->extension . '_' . $method;
if(! function_exists($m)) {
return false;
}
return call_user_func_array($m, $arguments);
}
}
?>
Utilisation
A titre indicatif, voici deux petits exemples d'utilisation :
require_once 'p2o.class.php';
// Utilisation avec MySQL
$mysql = new p2o('mysql');
@$mysql -> connect('localhost' , 'root' , '');
// Utilisation avec Curl
$curl = new p2o('curl');
$ch = $curl -> init('http://www.php.net');
$curl -> exec($ch);
?>
D'autres extensions
Voici une liste non exaustive d'extensions dont le nommage des fonctions est uniforme, et qui devraient donc fonctionner avec cette technique :
- Aspell
- Classkit
- crack
- curl
- dba
- dbx
- ftp
- imap
- mysql
- pspell
- session
- xml
- zip
- ...
Conclusion
Ca ne sert à rien ;).
Au-delà de cette conclusion un peu hative, je pense qu'on peut retenir deux points dans cet article.
Premièrement, une petite piqûre de rappel de l'utilisation de la méthode __call() de PHP5 ne peut pas faire de mal,
deuxiemement en se rendant compte que toutes les extensions ne peuvent pas être utilisées grâce à cette méthode,
on touche un point souvent reproché à PHP par rapport à d'autres langages,
le nommage « fantaisiste » de ces fonctions.
A quand la possibilité dans PHP d'utiliser n'importe quelle extension de manière procédurale et orientée objet,
et ce, nativement implémenté dans le langage ?
Trackback
Il n'y a pas de trackback recensé pour cet article.
Faire un trackback sur cet article http://classes.scriptsphp.org/Trackbackserver.Du-procedural-vers-l-objet, récupérer les trackback sur cet article