Boolesche Wert schaltet sich numerisch in PHP
Frage
EDIT: Ich meine Verwirrung glauben wahrscheinlich durch diesen Code am oberen Rand der Seite erstellt wird, in dem ich für den Wert der Option zu testen ... Dies erstellt eine Verknüpfung Methode, um die Option zu finden, ohne die get_option mit ( 'Option') Methode ...
global $options;
foreach ($options as $value) {
if (get_settings( $value['id'] ) === FALSE) {
$$value['id'] = $value['std'];
} else {
$$value['id'] = get_settings( $value['id'] );
}
}
Und wenn ich also den Wert einer Variable, $ myvar, über eine Checkbox in meinem Thema Panel-Optionen aktiviert und klicken Sie auf Speichern, dann meine options.php in Worpdress sehen, wird der Wert der Variablen
true
Und wenn ich einen Nachschlag auf dieser Variable mit
if($myvar == "true")
Es geht.
Allerdings, wenn ich den Wert direkt über die aktualisierungs () -Methode, wie so ...
$mvar = true;
update_option('myvar', $myvar);
Der Wert ändert sich von true auf 1
Und wenn ich den gleichen Vergleich nach wie vor tun, wenn ($ myvar == „true“), ist es nicht jetzt. Es ist nicht mehr "true".
Was bin ich? (1) Warum ist „true“ und 1, nicht die gleiche Bewertung und (2) Was ist die update_option Methode auf den Wert von myvar tun, den Wert von true auf 1 zu ändern?
Lösung
Versuchen
if($myvar == true)
und
$myvar = true;
TRUE
und FALSE
sind PHP in boolean Variablen aufgebaut, die als eine echte Saite viel universellere sind.
über die update_option. Es könnte nicht sein, dass die Option zum 1. Stattdessen ändert es sein könnte, dass der, wenn er sie in die Datenbank einfügen, sie es als String "true"
einfügt. Dann, wenn es darum geht, wieder wird es in den Booleschen Wert true
umgewandelt, das, wenn es gedruckt ist 1
Andere Tipps
Versuchen
if ($myvar)
Do not Test, ob die Dinge "gleich" wahr, sie sind entweder wahr oder sie sind es nicht.
Sie sollten Ihren ersten Test zu if($myvar == true)
oder einfach if ($myvar)
ändern. PHP hat einige seltsame Regeln für das, was „wahr“ ist; Im Allgemeinen evaulate Strings wahr, mit Ausnahme der besonderen Fälle von "0"
und einer leeren Zeichenfolge ""
, welche Art Guss auf false gesetzt.
In Ihrem speziellen Beispiel if ($myvar == "true")
:
- Wenn
$myvar
einen boolean enthält, wird der Ausdruck auswerten als(bool) == (bool)"true"
oder(bool) == true
- Wenn
$myvar
enthält eine ganze Zahl, es Wurf in einen String und im Vergleich mit dem String „true“; so dass Ihr Test versagt, weil "1"! = "true". - Wenn
$myvar
einen String, String-Vergleich stattfindet, und plötzlich nur noch die Zeichenkette „true“ wird erfolgreich vergleichen.
Ich würde vermuten, 2. und 3. Fälle wirksam sind: Wordpress ist wahrscheinlich Einstellung $myval
auf den String "true"
, wenn die von zurück gebucht, so dass Ihr Test besteht. Bei der manuell Sie boolean true
angeben, muß Wordpress in einer ganzen Zahl konvertiert es sein, und dann integer Vergleich stattfindet, und nicht, weil die ganze Zahl 1 wird auf Zeichenfolge "1"
wenn gegen "true"
verglichen gegossen wird.
Sie machen einen lockeren Vergleich zwischen der Zahl 1 und der String ‚true‘. Für diese PHP wird die Zeichenfolge in eine Zahl übersetzen. 'Test' als Nummer ist 0:
var_dump((int) 'true'); // int(0)
Und da 0 nicht gleich 1 ist, wird der Vergleich falsch zurück.
Wie einige andere Antworten schon richtig darauf hingewiesen, sollten Sie testen gegen die boolean wörtlich TRUE
oder true
. Wenn ein Operator in einer Gleichheitsprüfung ein boolean ist, wird PHP den anderen Operator in einen Booleschen konvertieren zu, die für die Zahl 1, geben
var_dump((bool) 1); // boolean(true)
Und dann Ihr Test vergehen, denn wahr ist gleich wahr.
Schauen Sie sich die Typ Vergleichstabelle zu verstehen, wie PHP jongliert Typen, wenn Prüfung auf Gleichheit .
Wie für das, was check_update
nicht zu Ihrem boolean Besuchen der Funktionsbeschreibung :
(gemischt) (erforderlich) Der neue Wert für diese Option Namen. Dieser Wert kann ein String, ein Array, ein Objekt oder ein serialisierte Wert.
Also, keine boolean erlaubt. Ich habe kurz versucht, von dem, um herauszufinden, Sourcecode , wo die Umwandlung stattfindet, aber da WP ein Chaos zu mir ist, konnte sie nicht finden. Wie jemand anderes vorgeschlagen, ist es wahrscheinlich passiert, wenn es in die Datenbank zu speichern und es dann immer wieder.
"true" ist eine Zeichenfolge, und alle Saiten evaulates auf die logische 1 (versuchen Casting (bool) $string
. true
auf der anderen Seite, ohne Anführungszeichen, ist ein boolean und wird auf 1 bewerten.