8791 sujets

Développement web côté serveur, CMS

bonsoir ,

En parcourant un article sur l'utilisation de sql/php il utilise dans leur code
la fonction assert


<?php 
assert(isset($_GET["id_message"]) && is_numeric($_GET["id_message"]));
require_once("connection.inc.php");
....

Dans le code "id_message" est un champ dans une table Mysql auto-incrémenter
(l'identifiant du message donc ...)

Je vais donc voir la Document 'PHP manuel' concernant assert() où il indique :
a écrit :

assert() va vérifier l'assertion 'assertion' et prendre la mesure appropriée si le résultat est FALSE
.....


Passe la discussion qui suit pour ou contre l'utiliser en production , mais ...
C'est quoi une assertion !?? Smiley ohwell
Parce que moi je n'ai pas trop compris Smiley lol

Dans mon exemple je comprends que l'on vérifie l'existence de id_message mais on vérifie quoi exactement avec assert(assertion) !!?

merci de votre aide
Salut Smiley cligne

j'ai trouvé ça.

Ce n'est pas beaucoup plus clair mais je dirais que ça ressemble à du debug Smiley rolleyes ...

Encore une dont je n'avais jamais entendu parler Smiley lol

A+

*Edit : j'ai trouvé une explication plus claire ! En pdf ou html
Modifié par Heyoan (31 May 2007 - 06:42)
Une assertion, c'est quand le développeur est vraiment sûr et certain à 100% qu'une condition à un moment donné est vérifiée.

Genre dans ton cas, il asserte qu'une variable dans $_GET est là et est numérique. Ca veut bien-sûr dire qu'en amont, il a fait toutes les vérifications nécessaires.

Ainsi, si jamais l'assertion n'est plus vérifiée, ça va planter le programme, et le développeur sera certain qu'il s'agira d'un bug de sa part.

L'exemple de nexen là n'est pas très bien par contre. Il teste si c'est un objet après l'assertion, il vaut mieux une gestion d'erreurs plus poussée. L'assertion sera placée plutôt ailleurs :

function connexion() {
  $link = @mysql_connect('localhost', 'root', '');
  if(!$link) {
    throw new Exception('Erreur de connexion à la base blablable');
  }
  return $link;
}

Et plus loin :
function query() {
  $link = connexion();

  assert(is_object($link));

  mysql_query('SELECT pouet', $link);
}


Là on assert donc que la fonction connexion nous a bien retourné un link valide. Si cas échéant, *boom*, y'a un bug quelque part.
Tiens autre exemple, quand utiliser une assertion et quand utiliser une exception. Alors genre vous avec une classe avec des fonctions qui prendent un paramètre :
class AfficheurDeTagadaEtDePouet {

  public function afficheTagada($tagada)
  {
      $this->affiche($tagada);
  }

  public function affichePouet()
  {
      $pouet = new Pouet();
      $this->affiche($pouet);
  }

  private function affiche($obj)
  {
      echo $obj;
  }

}


Alors soit une fonction afficheTagada publique qui affiche ce qu'on lui file, soit une fonction affichePouet qui affiche un nouveau Pouet. La méthode affiche, elle, est privée donc uniquement appellable par vous-même.

On va voir comment agrémenter tout ça. Pour la fonction affiche, vous et vous seul au monde peuvent l'appeller et êtent au courant de son existence. Le reste du monde ne voit que les méthodes publiques. Donc vous êtes garant de l'intégrité et de la santé mentale de la méthode, et donc devez être en mesure de garantir que le paramètre obj est parfaitement valide -> on va placer une assertion.

Pour la méthode afficheTagada, le paramètre peut sortir de n'importe où. Vous ne savez pas qui va transmettre un paramètre, et si ce paramètre va être valide. On pourrait mettre une assertion aussi, comme ça le développeur qui utiliserait votre méthode saurait qu'il a faillit à tâche, maintenant ce ne serait pas une vérité absolue : on ne peut pas garantir la situation. Et si on ne garantit rien, pas d'assertion. Donc Exception :
class AfficheurDeTagadaEtDePouet {

  public function afficheTagada($tagada)
  {
      if(!is_object($tagada)) {
         throw new Exception('Illegal Argument Exception : tagada must be an object');
      }
      $this->affiche($tagada);
  }

  public function affichePouet()
  {
      $pouet = new Pouet();
      $this->affiche($pouet);
  }

  private function affiche($obj)
  {
      assert(is_object($obj));
      echo $obj;
  }

}
bonjour,

merci pour toutes ces précisions ....

Et il va falloir que je relise tout cela à tête reposée Smiley lol , en rentrant du boulot ...

Au départ je ne connaissais pas la signification du mor assertion et comme tu le précise FlorentG assertion est une proposition (qui dans sa forme , peut être affirmative ou négative) que l'on avance et que l'on soutien comme vraie => affirmation , thése (dixit petit Robert ).

Ce qui me "facilite" la compréhension de tes exemples ...quoi que Smiley rolleyes
Je vais tester cela ce soir ....
Merci
.... de retour et ... ben non !!

a écrit :

Une assertion, c'est quand le développeur est vraiment sûr et certain à 100% qu'une condition à un moment donné est vérifiée.


jusque là çà va ... Smiley langue !!

....
 private function affiche($obj)
  {
      assert(is_object($obj));
      echo $obj;
  }
....


Dans l'assertion ( une affirmation donc ) on y met une condition "si" ( si c'est un objet on l'affiche ) ..... !
Dans ce cas c'est que: si l'assertion n'est plus vérifiée ... donc obligatoirement c'est le paramètre qui est 'faux' ( ou ne répond pas à la condition ) !???

Ps : je ne suis pas encore au php "orienté objet" mais cela ressemble fort à une classe Java (dans son ensemble Smiley smile )
Modifié par kzone (31 May 2007 - 22:48)