Fonctions silencieuses (quiet evaluation)

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Fonctions silencieuses (quiet evaluation)

par orgerix » 17 déc. 2008, 23:35

Mon idée serait de faire une variable avec la même portée que la fonction, qui serait indcatrice de la déclaration de la fonction. Ca donnerait quelque chose comme ca :
function mafonction($_1,$_2) {

}

$is_mafonction=true;
Après, je sais pas si c'est très propre.

par Hywan » 17 déc. 2008, 23:05

Plus moche que d'utiliser un arobase, et surtout moins sûr. Qui dit variable globale, dit modification globale, et ça c'est moche ;-).

par orgerix » 17 déc. 2008, 22:53

Sinon, lors de la déclaration de la fonction, on peut peut être créer une constante globale, qui sera définie seulement si la fonction est déclarée.

Enfin je suis pas trop sur que ca soit possible, mais au pire, faire une variable globale qu'on retransforme en constante (plutot moche...)

par Hywan » 17 déc. 2008, 14:40

Je vais réfléchir à toutes les solutions. Merci :).

par Calimero » 17 déc. 2008, 12:35

Elle ne te tente toujours pas ma variable d'environnement ? :cry:

A la base j'ai proposé une constante car c'est une façon simple et élégante de réaliser cela en C. Si on bossait en C, la seule alternative que je peux imaginer serait de définir une macro préprocesseur, qui à ma connaissance n'a pas d'équivalent en php.

Si tu veux vraiment aller au moins verbeux (sans trop de prise de tête, cad sans aller jusqu'à envisager un patch php), je ne vois pas mieux que l'arobase.

par Sékiltoyai » 17 déc. 2008, 01:21

Oui Sékil', mais il faut le minimum de code possible. J'évite d'écrire quelque chose de verbeux, ce n'est pas pour rajouter du code :).
Il faut aussi être réaliste. Si tu veux une solution acceptable, il faut faire des concessions…

par Hywan » 16 déc. 2008, 22:21

Oui Sékil', mais il faut le minimum de code possible. J'évite d'écrire quelque chose de verbeux, ce n'est pas pour rajouter du code :).

Pour répondre à Calimero, c'est pour des assertions pertinentes en PHP. Un projet universitaire que je mène actuellement.

par Sékiltoyai » 16 déc. 2008, 20:56

Tu encapsules l'appel du test dans une fonction/classe qui doit se charger de l'évaluation…

par Calimero » 16 déc. 2008, 19:54

Alors qu'avec ma solution, ça dépend du contexte/environnement dans lequel on exécute le code.
D'où ma proposition suivante de remplacer la constante par une variable d'environnement qui jouerait le même rôle et permettrait d'avoir deux comportements différents pour un code PHP identique (la bascule se faisant de manière externe).

Pour moi, le fait que ce soit écrit explicitement sous forme conditionnelle dans la fonction est un avantage : j'aime bien que le développeur puisse comprendre ce que fait le code et comment il le fait sans ambiguïté juste en le lisant.

Mais pourquoi as-tu ce besoin précis au fait ? :-)

par Hywan » 16 déc. 2008, 19:45

Pas bête, mais j'aimerais plus précisément ce comportement : si ma fonction existe (est déclarée) alors on l'exécute, sinon, pas d'erreur. D'où l'utilisation de l'arobase.
Avec ta solution, on repousse le problème dans la fonction et l'utilisateur doit modifier une constante. Alors qu'avec ma solution, ça dépend du contexte/environnement dans lequel on exécute le code.

Je ne pense pas que ce soit possible (sauf avec l'@). Mais sinon, j'ai une autre solution de rechange (totalement différente) mais un peu plus lourde. Donc je demande si jamais ;-).

par Calimero » 16 déc. 2008, 19:39

Je l'aurais fait comme ça, personnellement je ne pense pas que ça vaille vraiment le coup de chercher mieux :
define('FONCTION_ACTIVEE',true);

// ...

function mafonction(){
  if(!defined('FONCTION_ACTIVEE') || !FONCTION_ACTIVEE) return null;

  // Faire quelquechose d'utile ici
  $useful_stuff='ok';
  return $useful_stuff;
}
Ici on utilise donc une constante définie dans le code pour faire la bascule. Si tu tiens à avoir quelquechose d'externe, peut-être utiliser une variable d'environnement (définissable par exemple dans un .htaccess) ?

par Hywan » 16 déc. 2008, 18:16

J'ai déjà pensé au Runkit, mais il ne fait pas parti de la version standard de PHP, donc je l'écarte.

Si je dois utiliser APC, autant me faire mon propre fonctionnement, mais c'est un peu moche je trouve.

Et pour Jojolapine, exec() n'est pas la bonne fonction :P, mais je comprends ton idée. On s'écarte, mais je gardais cette idée sous le coude.

par Sékiltoyai » 16 déc. 2008, 13:36

HyWaN, regarde du côté de runkit peut être…

par katagoto » 16 déc. 2008, 13:15

Si non, il faudrait étendre l'APC pour pouvoir, avec un syntaxe de commentaire faire comme les macros C avec plusieurs niveaux, exemple :
#declare_macro:/*#quiet_evalutation#*/ as "function_exist('my_toto') and my_toto(arg1, …, argn);"

// Du code, puis à un moment...
/*#quiet_evalutation#*/
La déclaration est définie, le commentaire est remplacé, si non, rien, je pensais à l'APC pour sa mise en cache d'OPCode...

par jojolapine » 16 déc. 2008, 11:36

Et c'est peut-être bête et pas très performant, mais un truc du style
<?php
function F($function,$arg=null){

    if(function_exist($function){
        exec($function.'('.($arg!==null ? $arg : '').')');
        // ou un truc genre
        $$function($arg);
        // mais j'ai pas testé si ça marche... ;)
    }
}