Logo classes.scriptsphp.org PHP

go to nav bar

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.
<?php 
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 :

<?php 
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
  • pdf
  • 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

Merci de ne pas suivre ce lien emails.

0.0703s | «»
PHP powered