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, 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> Je m'attendais à ce que le à la place, je reçois l'erreur Essayons cela à la place: P> $ 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>.
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>
objet de la fermeture de classe n'a pas pu être converti en chaîne code>. p>
if (function() { return false; }) {
echo 'foo';
}
else {
echo 'true';
}
5 Réponses :
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'; }
fonction () {renvoie false; } code> crée un objet de type
fermeture code> , similaire à
Nouveau code> avec d'autres types de classe, comparez le code suivant:
$ Func code> est un objet. Chaque objet retourne true dans une clause
si code>. SO P>
if ($func())
{
# true
} else {
# false
}
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();
Vous créez une fonction anonyme, mais ne l'exécutant jamais. Lorsque vous testez Vous devez appeler la fermeture et attribuer son résultat à $ q = fonction () {retour 'foo'; } code>, 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?) P>
$ q code> avant de tester et de faire écho
$ q p>. p>.
Les fermetures de PHP sont implémentées comme un hack-hack - objets de type fermeture code>
. 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 à
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;} ()) { code> qui est apparemment valide en JavaScript mais pas PHP.
PHP Manuel: Conversion de Boolean