Au pire oui , ça m'a l'air intéressant, ca ne change pas le principe de la class, ne la complique pas et permet en effet de changer le nom de la class sans changer autre chose ensuite dans la class.hello, au lieu de self tu peux essayer avec la constante __CLASS__ (mais pas sur que ca marche sous 5.3 non plus)
Quand tu parles de array(), je suppose que tu parles de ceci: array(get_class($this), 'x_hex2str').sinon utilisé avec array qui marche autant avec le static que le pas static...
Retourne le nom de la classe pour laquelle object est une instance. Retourne FALSE si object n'est pas un objet.
array(__CLASS__, 'x_hex2str')
<?php
class maClass extends PhpHex2Str
{
public static function x_hex2str($hex) {
echo "Some stuff";
return parent::x_hex2str($hex)
}
public static function decode($strings = null) {
echo "foobar";
return parent::decode($strings)
}
}
// Exemple 1
$strings = 'a %20 b%0A h %27 h %23';
print maClasse::decode($strings);
Va afficher "foobar", mais pas "Some stuff", parce que l'appel à "__CLASS__::x_hex2str()" se fera relativement à la classe "PhpHex2Str" et pas "maClasse"
$class = __CLASS__ . '::x_hex2str';
si tu l'écris en direct comme il la fait c'est pareil.Attention, en utilisant __CLASS__, il ne sera plus possible de surcharger la méthode !
__CLASS__ se rapporte à la classe dans laquelle se trouve le mot-clé.
Donc, si on surcharge la classe de la sorte :
<?php class maClass extends PhpHex2Str { public static function x_hex2str($hex) { echo "Some stuff"; return parent::x_hex2str($hex) } public static function decode($strings = null) { echo "foobar"; return parent::decode($strings) } } // Exemple 1 $strings = 'a %20 b%0A h %27 h %23'; print maClasse::decode($strings); Va afficher "foobar", mais pas "Some stuff", parce que l'appel à "__CLASS__::x_hex2str()" se fera relativement à la classe "PhpHex2Str" et pas "maClasse"
<?php
class PhpHex2Str
{
public function x_hex2str($hex) {
if (is_array($hex)) $hex = substr($hex[0], 1);
$hex = (string) $hex;
$str = '';
for($i=0;$i < strlen($hex);$i+=2) {
$str.=chr(hexdec(substr($hex,$i,2)));
}
return $str;
}
public function decode($strings = null) {
$strings = (string) $strings;
return preg_replace_callback('#\%[a-zA-Z0-9]{2}#',array($this,'x_hex2str'), $strings);
}
}
Comme ça surcharge authorisée return preg_replace_callback('#\%[a-zA-Z0-9]{2}#',array(self,'x_hex2str'), $strings);
devrait fonctionner, mais là je ne suis pas sûr, a tester donc
ouai c'est bien pratique ca ma beaucoup manquer on était obliger de bidouiller avec le debug_backtrace pour la recréerOui surement, mais le but de l'exercice était de mettre les deux fonctions en statique.
Enfin plus exactement, ca l'est devenue au cours de ce topic![]()
Mais c'est vrai que cela simplifierait le problème.
Sinon la fonction get_called_class() est intéressante, mais n'est pas définit en dessous 5.3.
Donc au pire faudrait retrouver les sources de cette fonction pour la reproduire en dessous de 5.3...
return preg_replace_callback('#\%[a-zA-Z0-9]{2}#',array(self,'x_hex2str'), $strings);