Class PhpHex2Str

ViPHP
ViPHP | 5462 Messages

22 mars 2010, 11:22

hello, au lieu de self tu peux essayer avec la constante __CLASS__ (mais pas sur que ca marche sous 5.3 non plus)
sinon utilisé avec array qui marche autant avec le static que le pas static...

Mammouth du PHP | 985 Messages

22 mars 2010, 12:49

Bonjour,
hello, au lieu de self tu peux essayer avec la constante __CLASS__ (mais pas sur que ca marche sous 5.3 non plus)
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.
sinon utilisé avec array qui marche autant avec le static que le pas static...
Quand tu parles de array(), je suppose que tu parles de ceci: array(get_class($this), 'x_hex2str').

Valeurs de retour de get_class():
Retourne le nom de la classe pour laquelle object est une instance. Retourne FALSE si object n'est pas un objet.

De plus si j'ai bien compris, $this aura un problème similaire ou du même ordre.
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 5462 Messages

22 mars 2010, 12:52

tu peux faire comme ca vu que t'es en statique
array(__CLASS__, 'x_hex2str')

Mammouth du PHP | 985 Messages

22 mars 2010, 12:56

Ok oui en effet, utiliser un array() avec __CLASS__ à cause du callback...
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

22 mars 2010, 13:27

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"
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 985 Messages

22 mars 2010, 13:31

Ok oui merci zeus pour la précision.
Je comprends mieux maintenant, la différence d'utilisation de self et __CLASS__, je les trouvais bien trop similaires justement.

et sinon à stealth35: pour éviter d'utiliser ce array():
$class = __CLASS__ . '::x_hex2str';
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 5462 Messages

22 mars 2010, 14:44

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"
si tu l'écris en direct comme il la fait c'est pareil.

Mammouth du PHP | 985 Messages

22 mars 2010, 14:53

En gros cela veut dire, que mettre le nom de la class ou __CLASS__ dans ce cas précis, ce change quasiment rien à part si un jour tu désires changer le nom de la class.
Ce qui tu avoueras ne devrait pas arriver tous les 4 matins :wink:
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 5462 Messages

22 mars 2010, 14:59

oui et non, puisque dans les 2 cas la surcharge marche pas mettre :
__CLASS__::mafonction
MaClass::mafonction

ca ira dans MaClass dans tout les cas, donc niveau surcharge on oublie SAUF (héhé) depuis PHP 5.3 on a get_called_class, qui va te dire quelle class est appelé, du coup la on peu faire de la surcharge (même statique héhé), par contre faut prévoir avant.

Mammouth du PHP | 985 Messages

22 mars 2010, 15:02

En gros tu dis autrement ce que je viens de dire.
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 5462 Messages

22 mars 2010, 15:10

c'était plus pour ton montrer par rapport a la surcharge :wink:

ViPHP
ViPHP | 3607 Messages

22 mars 2010, 15:26

Sinon la méthode la plus simple...:
<?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 :)
Après si on veut des méthodes statiques,
        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 :)

Mammouth du PHP | 985 Messages

22 mars 2010, 15:38

Oui 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 :wink:
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...

[EDIT]
Jojopaline, array(self,'x_hex2str') fonctionne :wink:

Par contre: pourquoi? -> j'en ai aucune idée.

Utiliser un array() ici n'est pas déconseillé?
Et ensuite pourquoi cela fonctionne comme ceci?
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 5462 Messages

22 mars 2010, 15:58

Oui 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 :wink:
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...
ouai c'est bien pratique ca ma beaucoup manquer on était obliger de bidouiller avec le debug_backtrace pour la recréer :D

par contre jojo ca marchera pas ca :
return preg_replace_callback('#\%[a-zA-Z0-9]{2}#',array(self,'x_hex2str'),  $strings);

Mammouth du PHP | 985 Messages

22 mars 2010, 16:41

Cela fonctionne en 5.2.6 en tout cas.

Et pourquoi un array() fonctionne à l'appel d'une fonction statique contenue dans un objet?
Et comment et de quelle façon est traité ce array()?
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.