février
2008
Imaginez les lourdes fonctions mysqli_* , comme mysqli_fetch_array(), ou encore mysqli_character_set_name().
J’ai réalisé une petite classe de Proxy. Pour moi, j’écris
$proxy->fetchArray() , ou encore $proxy->characterSetName().
Ma classe proxy prend en paramètre le nom de la fonction que l’on veut proxier. Il est mieux d’utiliser les fonctions d’une extension, qui commencent toutes par le même nom.
Ensuite, appelez le « reste de la fonction », comme une méthode de la classe, en remplaçant les _ par une syntaxe CamelCase, plus sympatique. De plus, les erreurs PHP générées par la fonction proxiées sont interceptées, et tranformées en exceptions, plus pratiques à gérer aussi.
Le tour est joué
$proxy = new Proxy('str');
echo $proxy->replace('coucou','hello','coucou developpez');
$proxy->setProxy('array');
$myArray = $proxy->changeKeyCase($myArray);
Ca n’a d’interêt que de montrer la flexibilité de PHP. Cela peut être utilisé dans des cas réels de proxy et de décorateur, mais je n’en ai pas sous la main.
Attention toutefois, __call() et call_user_* sont des fonctions réputées gourmandes en traitement PHP.
En revanche, on peut toujours l’améliorer, pour rendre la tranformation CamelCase facultative, etc…
Ah j’oubliais, la classe ^^
<?php
class functionProxy
{
const SEPARATOR = '_';
private $proxy;
public function __construct($name)
{
$this->proxy = (string)$name;
}
public function __call($func,$args)
{
$func = strtolower(preg_replace(array('#(?<=(?:[A-Z]))([A-Z]+)([A-Z][A-z])#', '#(?<=(?:[a-z]))([A-Z])#'),
array('\1' . '_' . '\2', '_' . '\1'),(string)$func));
if (function_exists($this->proxy.self::SEPARATOR.$func)){
unset($php_errormsg);
if (ini_get('track_errors') == 0){
ini_set('track_errors',1);
}
$return = @call_user_func_array($this->proxy.self::SEPARATOR.$func,$args);
ini_restore('track_errors');
if (isset($php_errormsg)){
throw new Exception($php_errormsg);
}
return $return;
}else{
throw new Exception("PHP function $this->proxy".self::SEPARATOR."$func doesn't exists");
}
}
public function setProxy($proxy)
{
$this->proxy = (string)$proxy;
}
}
Commentaires récents
Archives
- novembre 2010
- août 2010
- juillet 2010
- juin 2010
- mai 2010
- avril 2010
- mars 2010
- février 2010
- janvier 2010
- décembre 2009
- novembre 2009
- octobre 2009
- septembre 2009
- août 2009
- juillet 2009
- juin 2009
- mai 2009
- avril 2009
- mars 2009
- février 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- août 2008
- juillet 2008
- juin 2008
- mai 2008
- avril 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- octobre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007
- avril 2007
- mars 2007
- février 2007