Cours

Accédez à nos cours concernant des domaines et thématiques différentes. Vous pouvez aussi contribuer en rédigeant des articles.

Consulter les cours

Écoles

Parcourez notre annuaire d’écoles, instituts et universités du monde. Si votre école n’est pas listée, vous pouvez l’ajouter très facilement.

Consulter les écoles

Tchat

Accédez à notre messagerie instantanée pour échanger avec d’autres membres inscrits et aussi les invités. Aucune inscription n’est obligatoire.

Accéder au tchat

“Le présent article n'a pas encore été revu par un modérateur, pour cela veuillez faire attention quant à son contenu, que nous ne pouvons pas vous garantir son exactitude.”

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 avec l'extension MySQLi

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 du procédural à l'orienté objet

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 :

<?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

À 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 exhaustive d'extensions dont le nommage des fonctions est uniforme, et qui devraient donc fonctionner avec cette technique :

Conclusion

Ça ne sert à rien ;). Au-delà de cette conclusion un peu hâtive, 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, deuxièmement 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.

À 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 ?

Approfondissez votre lecture :

Informations sur l'auteur

codeur
  • Pseudo : codeur
  • Date de naissance : 1985-10-03
  • Age : 40 ans
  • Pays : Maroc
  • école

Informations sur le cours

  • Nombre de fois vus : 4986
  • Langue de rédaction : Français
  • Date de création : le 02/05/2017 à 19:00:45
  • Date de mise à jour : le 02/05/2017 à 19:02:56

Aidez la Communauté des Étudiants !