CLASSE DE VÉRIFICATION DE DONNÉES

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 - 2 nov. 2008 à 01:21
iow4 Messages postés 302 Date d'inscription samedi 22 octobre 2005 Statut Membre Dernière intervention 2 novembre 2008 - 2 nov. 2008 à 12:32
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/48358-classe-de-verification-de-donnees

iow4 Messages postés 302 Date d'inscription samedi 22 octobre 2005 Statut Membre Dernière intervention 2 novembre 2008 4
2 nov. 2008 à 12:32
Je trouve ça pas mal comme idée (surtout après les nombreux commentaires)
Pour les gros projets on peut se permettre d'utiliser des frameworks tel que Symfony qui nous fournit un niveau d'abstraction pour la gestion des vérification (syntaxe yaml par exemple pour la validation des actions)
Mais pour des petits projets c'est bien trop lourd, c'est là que ta class s'avère utile ;)
Cela permet de faire un framework light ;)

A réutiliser pour ma part ;)
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
2 nov. 2008 à 12:01
Plop,

Y'a pas de raisons de ne pas laisser cette source en ligne.

Faire une classe, pourquoi pas... ce n'est pas indispensable, mais pourquoi pas, à condition que ce soit une classe statique (pas de constructeur, et toutes les méthodes statiques). L'intérêt d'une classe statique :
- embarquer des fonctions qui font partie d'un même package
- pouvoir appeler ces fonctions de n'importe où dans le code
- ne pas avoir à se soucier des noms des fonctions, puisque seul le nom de la classe ne doit pas être dupliqué (c'est un peu le principe des namespaces de php5.3, mais pas aussi poussé ni complexe).
Avec une classe instantiable, il faut avoir un objet instancié, qui ne sera accessible que dans une portée définie (script, fonction, classe, etc). C'est une limitation plus qu'une fonctionnalité.
Quand à l'extension Filter, oui, elle est installé de base dans PHP (enfin j'ai rien trouvé qui indique le contraire).

Encore quelques petites optimisations...
Inutile de stocker le résultat d'une fonction pour le retourner immédiatement. Le stockage dans une variable à un coût en perfs (vraiment dérisoire, mais quand on peut s'en passer...). Tu peux te permettre de renvoyer simplement la chaîne, par exemple dans deletOneChar() :
Au lieu de :
# $string = ereg_replace($char,"",$string);
# return $string;

Simplement :
return preg_replace('`'.preg_quote($char)'`', '', $string);

Ou encore :

# public function checkLink($link)
# {
# $conn = @fopen($link, "r");
# if(! $conn ){
# return $this->isValidLink = false;
# }
# return $this->isValidLink = true;
# }

Plus simplement :
public static function checkLink($link) {
return (bool) @fopen($link, 'r');
}

C'est un poil plus optimisé et pas moins lisible.

Voilà voilà.. Bon dimanche ^^
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
2 nov. 2008 à 11:52
Tu peux la laisser mais dans ce cas retire les attributs de ta classe et ajoute le mot-clé "static" devant la signature de tes fonctions pour en faire des méthodes statiques.

class MyClass {

public static myMethod($a) {
return $a*2;
}
}

echo MyClass::myMethod(8);

++
swaenboutu Messages postés 22 Date d'inscription jeudi 11 novembre 2004 Statut Membre Dernière intervention 18 avril 2016
2 nov. 2008 à 11:16
je vous remercie pour tout ces commentaires c'est justement pour ça que j'ai mis cette classe en ligne... j'ignorais l'existence de la fonction filter (est-elle installer de base avec php5?)
je ne savais pas non plus que pereg était plus performant que ereg... Quand au fait de faire une classe je dirai juste c'est pas faux et du coup je me demande pourquoi j'ai fait une classe (peut être parce que je veux TOUT faire en objet maintenant que je l'ai découvert...) Bon au final je me demande si je dois laisser cette source en ligne et je vous remercie de ces commentaires
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
2 nov. 2008 à 10:18
Personnellement je ne vois pas l'utilité de pouvoir instancier une telle classe, donc pas la peine d'écrire des attributs. Au final, on devrait se contenter de faire des appels statiques de méthodes puisqu'en fin de compte, ta classe n'embarque qu'une collection de fonctions utilisateurs.

Quant aux commentaires de NeigeDHiver, je plussoie. Utilise les possibilités de l'extension Filter de PHP 5 et remplace tous tes ereg_*() par les fonctions équivalentes plus performantes.

++
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
2 nov. 2008 à 01:23
Je viens de voir l'expression régulière que tu construis dans la méthode de vérification d'email... Elle me semble très peu optimisée... Faudrait que je regarde ça de plus près, mais je pense que tu te compliques la vie pour pas grand chose, on peut faire plus simple. (pis en utilisant la fonction de filtre, c'est encore plus simple...)
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
2 nov. 2008 à 01:21
Salut,

J'ai pas regardé en détails (je regarde rarement en détails, oui, je sais, c'est mal), mais j'ai quand même des choses à dire...

1/ Pour vérifier une adresse email, il existe des fonctions de filtres qui permettent de ne pas avoir à recoder une fonction native (qui est nécessairement plus performante) : http://fr.php.net/manual/fr/book.filter.php
Par exemple : filter_var($user_email, FILTER_VALIDATE_EMAIL);

2/ Dans la méthode noPunctuation() ereg est énormément moins performant que preg à motif égal. En outre, preg_replace accepte en argument un tableau de motifs et un tableau de remplacements, ce qui évite d'appeler 6 fois de suite ereg_replace.
Par ailleurs, il manque la suppression du caractère points de suspensions ( … ), et les points d'interrogation et d'exclamation inversés.

3/ Dans la méthode checkIP
# if(preg_match($handler,$ip)){
# return $this->isValidIp = true;
# }
# return $this->isValidIp = false;

N'est-il pas plus simple et plus lisible de faire une seule ligne :
return (bool) preg_match('`([0-9]{1,3}\.){3}[0-9]{1,3}`', $ip);

D'ailleurs cette méthode est valable pour une IPv4, mais pas pour une IPv6.

4/ D'une manière générale, pourquoi avoir fait une classe "standard" ? Pourquoi pas plutôt une classe statique, ou, plus simplement, une collection de fonctions ?
Je ne vois pas l'intérêt d'une classe dans la mesure où on n'a pas besoin d'instancier un objet...

5/ Concernant les propriétés :
# public $isValidEmail;
# public $isNumber;
# public $isValidDate;
# public $isValidHour;
# public $isValidLink;
# public $isValidIp;

Si tu dois les initialiser à false dans le constructeur, pourquoi ne pas alléger le code ?
public $isValidEmail = false;
public $isNumber = false;
public $isValidDate = false;
public $isValidHour = false;
public $isValidLink = false;
public $isValidIp = false;

Je pense que voilà de quoi optimiser ta source :)
Rejoignez-nous