Accédez à nos cours concernant des domaines et thématiques différentes. Vous pouvez aussi contribuer en rédigeant des articles.
Consulter les coursParcourez 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 écolesAccé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.”
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.
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 :
<?php
$link = mysqli_connect('localhost', 'root', 'password', 'base');
echo mysql_get_server_info();
mysql_close($link);
?>
<?php
$mysqli = new mysqli('localhost', 'root', 'password', 'base');
echo $mysqli -> server_info;
$mysqli -> close();
?>
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);
}
}
?>
À 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);
?>
Voici une liste non exhaustive d'extensions dont le nommage des fonctions est uniforme, et qui devraient donc fonctionner avec cette technique :
Ç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 ?