8
votes

Qu'est-ce que les fermetures php rentrent dans les déclarations si?

Mon objectif est de mettre une logique complexe dans une déclaration if (). Disons que j'ai une gamme de valeurs et je vais exécuter un peu de code si tout dans mon tableau est non nul. Normalement, je pouvais dire, $ valide = true code>, foreach code> mon tableau et définir $ valide = false code> quand un zéro est trouvé. Ensuite, j'exécuterais mon code si ($ valide) code>. Alternativement, je pourrais mettre ma boucle dans une fonction et mettre la fonction inopie mon si () code>.

mais je suis paresseux, donc je préfère ne pas faire boucher avec un tas de "valide "Les drapeaux, et je préférerais ne pas écrire une nouvelle fonction qui n'est utilisée qu'à un endroit. P>

Donc, disons que j'ai ceci: p> xxx pré>

Je m'attendais à ce que le si code> obtient 'foo' code>, qui évalue à vrai. Ma fermeture s'engage à $ q code> et l'instruction exécute. $ q code> retourne string foo code> et "foo 'est imprimé. p>

à la place, je reçois l'erreur objet de la fermeture de classe n'a pas pu être converti en chaîne code>. p>

Essayons cela à la place: P>

if (function() { return false; }) {
  echo 'foo';
}
else {
  echo 'true';
}


4 commentaires

Vous semblez confondre des fonctions avec leurs valeurs de retour.


Je suppose que ce que je voulais était plus proche de si (fonction () {retour false;} ()) { qui est apparemment valide en JavaScript mais pas PHP.


PHP Manuel: Conversion de Boolean


5 Réponses :


3
votes

Ces deux évaluent à vrai.

Vous devez faire exécuter la fonction pour l'utiliser dans l'instruction IF. P>

Essayez ceci: P>

$q = function() { return false; };
if ($q()) { //should not go here.
  echo $q();
}
else {
  echo 'false';
}


0 commentaires


1
votes

Vous n'exécutez pas la fermeture lorsque vous appelez echo code>, il tente donc d'imprimer la fermeture et non du résultat de la fermeture:

echo $q();


0 commentaires

0
votes

Vous créez une fonction anonyme, mais ne l'exécutant jamais. Lorsque vous testez $ q = fonction () {retour 'foo'; } , ce que vous dites est "Attribuez une référence à cette fonction anonyme à $ q, et transmettez ce test si $ q n'est pas null" (n'est pas PHP Fun?)

Vous devez appeler la fermeture et attribuer son résultat à $ q avant de tester et de faire écho $ q . .


0 commentaires

2
votes

Les fermetures de PHP sont implémentées comme un hack-hack - objets de type fermeture . Votre code instanticule réellement un objet de cette classe et l'attribuant à $ q. En PHP, le résultat de l'affectation est la valeur attribuée, de sorte que le code revient à résoudre à xxx


0 commentaires