Powiedziano mi, że dobrzy programiści mogą rozpoznać / wykorzystać różnicę między Null
i False
a 0
i wszystkie inne dobre „nic” podmioty.
Jaka jest różnica, szczególnie w PHP? Czy to ma coś wspólnego ===
?
Powiedziano mi, że dobrzy programiści mogą rozpoznać / wykorzystać różnicę między Null
i False
a 0
i wszystkie inne dobre „nic” podmioty.
Jaka jest różnica, szczególnie w PHP? Czy to ma coś wspólnego ===
?
Odpowiedzi:
Null
znaczy „ nic ”. Zmienna nie została zainicjowana.
False
oznacza „ nieprawda w kontekście boolowskim ”. Używane do wyraźnego pokazania, że masz do czynienia z problemami logicznymi.
0
jest int
. Nie ma nic wspólnego z resztą powyżej, używaną do matematyki.
Trudne jest to, że w językach dynamicznych, takich jak PHP, wszystkie mają wartość w kontekście logicznym , którym (w PHP) jestFalse
.
Jeśli przetestujesz to z ==
, testuje wartość logiczną, więc uzyskasz równość. Jeśli przetestujesz to z===
, przetestuje typ, a otrzymasz nierówność.
Cóż, spójrz na strrpos()
funkcję. Zwraca False, jeśli nic nie znalazł, ale 0, jeśli znalazł coś na początku ciągu!
<?php
// pitfall :
if (strrpos("Hello World", "Hello")) {
// never exectuted
}
// smart move :
if (strrpos("Hello World", "Hello") !== False) {
// that works !
}
?>
I oczywiście, jeśli masz do czynienia ze stanami:
Chcesz zrobić różnicę między DebugMode = False
(ustawione na wyłączone), DebugMode = True
(ustawione na włączone) i DebugMode = Null
(w ogóle nie ustawione, doprowadzi do trudnego debugowania ;-)).
null
jest null
. false
jestfalse
. Smutne ale prawdziwe.
nie ma dużej spójności w PHP. programiści TRY aby wartość null oznaczała „nieznany” lub „nieistniejący”. ale często False będzie służyć jako „nieistniejący” (np. strrpos („fail”, „search”) zwróci wartość false, a nie null)
często zobaczysz null używane, gdy już używają fałszu do czegoś. np. filter_input (). Zwracają fałsz, jeśli zmienna nie przejdzie filtru. i null, jeśli zmienna nie istnieje (nie istnieje oznacza, że również nie przeszła filtru? więc po co zwracać wartość null?!?)
php ma wygodę zwracania danych w funkcjach. i często programiści wbijają wszelkiego rodzaju statusy awarii zamiast danych.
W PHP nie ma rozsądnego sposobu wykrywania danych (int, str, itp.) Przed awarią (false, null)
w zasadzie zawsze musisz sprawdzać, czy === null lub === false, w zależności od funkcji. lub dla obu, w przypadkach takich jak filter_input () / filter_var ()
a oto trochę zabawy z żonglowaniem typami. nawet nie uwzględniając tablic i obiektów.
var_dump( 0<0 ); #bool(false)
var_dump( 1<0 ); #bool(false)
var_dump( -1<0 ); #bool(true)
var_dump( false<0 ); #bool(false)
var_dump( null<0 ); #bool(false)
var_dump( ''<0 ); #bool(false)
var_dump( 'a'<0 ); #bool(false)
echo "\n";
var_dump( !0 ); #bool(true)
var_dump( !1 ); #bool(false)
var_dump( !-1 ); #bool(false)
var_dump( !false ); #bool(true)
var_dump( !null ); #bool(true)
var_dump( !'' ); #bool(true)
var_dump( !'a' ); #bool(false)
echo "\n";
var_dump( false == 0 ); #bool(true)
var_dump( false == 1 ); #bool(false)
var_dump( false == -1 ); #bool(false)
var_dump( false == false ); #bool(true)
var_dump( false == null ); #bool(true)
var_dump( false == '' ); #bool(true)
var_dump( false == 'a' ); #bool(false)
echo "\n";
var_dump( null == 0 ); #bool(true)
var_dump( null == 1 ); #bool(false)
var_dump( null == -1 ); #bool(false)
var_dump( null == false ); #bool(true)
var_dump( null == null ); #bool(true)
var_dump( null == '' ); #bool(true)
var_dump( null == 'a' ); #bool(false)
echo "\n";
$a=0; var_dump( empty($a) ); #bool(true)
$a=1; var_dump( empty($a) ); #bool(false)
$a=-1; var_dump( empty($a) ); #bool(false)
$a=false; var_dump( empty($a) ); #bool(true)
$a=null; var_dump( empty($a) ); #bool(true)
$a=''; var_dump( empty($a) ); #bool(true)
$a='a'; var_dump( empty($a)); # bool(false)
echo "\n"; #new block suggested by @thehpi
var_dump( null < -1 ); #bool(true)
var_dump( null < 0 ); #bool(false)
var_dump( null < 1 ); #bool(true)
var_dump( -1 > true ); #bool(false)
var_dump( 0 > true ); #bool(false)
var_dump( 1 > true ); #bool(true)
var_dump( -1 > false ); #bool(true)
var_dump( 0 > false ); #bool(false)
var_dump( 1 > true ); #bool(true)
var_dump( null == 0 );
.
0 == null
i null == []
, ale [] != 0
!!
strrpos('fail', 'search') will return false, and not null
moim zdaniem jest poprawne - jeśli null
oznacza nieznane, to strrpos
zwrócenie null
byłoby takie, jak powiedzenie „Nie wiem, czy ciąg tam jest”, a nie „Ciąg nie istnieje”.
Poniżej przykład:
Comparisons of $x with PHP functions
Expression gettype() empty() is_null() isset() boolean : if($x)
$x = ""; string TRUE FALSE TRUE FALSE
$x = null; NULL TRUE TRUE FALSE FALSE
var $x; NULL TRUE TRUE FALSE FALSE
$x is undefined NULL TRUE TRUE FALSE FALSE
$x = array(); array TRUE FALSE TRUE FALSE
$x = false; boolean TRUE FALSE TRUE FALSE
$x = true; boolean FALSE FALSE TRUE TRUE
$x = 1; integer FALSE FALSE TRUE TRUE
$x = 42; integer FALSE FALSE TRUE TRUE
$x = 0; integer TRUE FALSE TRUE FALSE
$x = -1; integer FALSE FALSE TRUE TRUE
$x = "1"; string FALSE FALSE TRUE TRUE
$x = "0"; string TRUE FALSE TRUE FALSE
$x = "-1"; string FALSE FALSE TRUE TRUE
$x = "php"; string FALSE FALSE TRUE TRUE
$x = "true"; string FALSE FALSE TRUE TRUE
$x = "false"; string FALSE FALSE TRUE TRUE
Zobacz to, aby uzyskać więcej informacji na temat porównań typów w PHP. Powinien dać ci jasne zrozumienie.
W PHP możesz użyć operatorów === i! ==, aby sprawdzić nie tylko, czy wartości są równe, ale także, czy ich typy są zgodne. Na przykład: 0 == false
jest true
, ale 0 === false
jest false
. To samo dotyczy !=
versus !==
. Również w przypadku porównanianull
z pozostałymi dwoma przy użyciu wspomnianych operatorów, spodziewaj się podobnych wyników.
Teraz w PHP ta jakość wartości jest zwykle używana podczas zwracania wartości, która czasami może wynosić 0
(zero), ale czasami może się zdarzyć, że funkcja zawiodła. W takich przypadkach w PHP wracasz false
i musisz sprawdzić te przypadki za pomocą operatora tożsamości ===
. Na przykład, jeśli szukasz pozycji jednego ciągu w drugim i używasz strpos()
, ta funkcja zwróci pozycję numeryczną, która może wynosić 0, jeśli ciąg znajduje się na samym początku, ale jeśli nie znaleziono ciągu wszystko, a potem strpos()
wrócifalse
i musisz wziąć to pod uwagę, mając do czynienia z wynikiem.
Jeśli użyjesz tej samej techniki w swoich funkcjach, każdy, kto zna standardową bibliotekę PHP, zrozumie, co się dzieje i jak sprawdzić, czy zwracana wartość jest tym, czego oczekuje, lub czy wystąpił jakiś błąd podczas przetwarzania. To samo dotyczy parametrów funkcji, możesz je przetwarzać w różny sposób w zależności od tego, czy są to tablice, łańcuchy, czy też nie, a ta technika jest również używana w całym PHP, więc każdy może ją łatwo uzyskać. Więc myślę, że to jest moc.
False, Null, Nothing, 0, Undefined itd., Itd.
Każdy z nich ma określone znaczenie, które koreluje z rzeczywistymi pojęciami. Czasami wiele znaczeń jest przeciążanych w jednym słowie kluczowym lub wartości.
W C i C ++ , NULL
, False
i 0
są przeciążone do tej samej wartości. W C # są to 3 różne koncepcje.
null
lub NULL
zwykle wskazuje na brak wartości, ale zwykle nie określa, dlaczego.
0
wskazuje liczbę naturalną zero i ma równoważność typu do 1, 2, 3 itd., aw językach obsługujących odrębne pojęcia NULL
należy traktować tylko liczbę.
Fałsz oznacza nieprawdę . I używany w wartościach binarnych . Nie oznacza to, że jesteś niezadowolony, ani nie oznacza 0
. Po prostu wskazuje jedną z dwóch wartości binarnych.
Nic nie może wskazywać, że wartość jest specjalnie ustawiona na nic, co wskazuje na to samo co null, ale z zamiarem.
Wartość undefined w niektórych językach wskazuje, że wartość nie została jeszcze ustawiona, ponieważ żaden kod nie określił rzeczywistej wartości.
Właśnie zmarnowany 1/2 dzień próbuje dostać albo 0
, null
, false
aby powrócić zstrops
!
Oto wszystko, co próbowałem zrobić, zanim odkryłem, że logika nie płynie we właściwym kierunku, wyglądając na czarną dziurę w kodowaniu php:
Pomysł weź nazwę domeny hostowanej na serwerze i upewnij się, że nie jest to poziom root. OK, kilka różnych sposobów, aby to zrobić, ale wybrałem inną ze względu na inne funkcje / konstrukcje php, które zrobiłem.
Zresztą tutaj była podstawa stwierdzenia:
if (strpos($_SERVER ['SERVER_NAME'], dirBaseNAME ())
{
do this
} else {
or that
}
{
echo strpos(mydomain.co.uk, mydomain);
if ( strpos(mydomain, xmas) == null )
{
echo "\n1 is null";
}
if ( (strpos(mydomain.co.uk, mydomain)) == 0 )
{
echo "\n2 is 0";
} else {
echo "\n2 Something is WRONG";
}
if ( (mydomain.co.uk, mydomain)) != 0 )
{
echo "\n3 is 0";
} else {
echo "\n3 it is not 0";
}
if ( (mydomain.co.uk, mydomain)) == null )
{
echo "\n4 is null";
} else {
echo "\n4 Something is WRONG";
}
}
WRESZCIE po przeczytaniu tego tematu stwierdziłem, że to zadziałało !!!
{
if ((mydomain.co.uk, mydomain)) !== false )
{
echo "\n5 is True";
} else {
echo "\n5 is False";
}
}
Dzięki za ten artykuł, teraz rozumiem, że nawet jeśli są Święta Bożego Narodzenia, może to nie być Boże Narodzenie false
, ponieważ może to byćNULL
dzień!
Po zmarnowaniu dnia na debugowanie prostego kodu, żałowałem, że nie wiedziałem o tym wcześniej, ponieważ nie byłbym w stanie zidentyfikować problemu, zamiast chodzić po całym miejscu, próbując go uruchomić. To nie działa, jak False
, NULL
i 0
nie wszystkie są takie same, jak True or False or NULL
?
Aby jawnie przekonwertować wartość na wartość logiczną, użyj rzutowania (bool) lub (boolean).
Jednak w większości przypadków rzutowanie nie jest konieczne, ponieważ wartość zostanie automatycznie przekonwertowana, jeśli operator, funkcja lub struktura kontrolna wymaga argumentu logicznego.
Podczas konwersji na wartość logiczną następujące wartości są uważane za FAŁSZ:
FALSE
sama wartość 0.0
(zero) "0"
NULL
(w tym nieustawione zmienne) TRUE
(w tym dowolny zasób). Więc w większości przypadków jest tak samo.
Z drugiej strony, ===
i ==
nie są tym samym. Zwykle wystarczy operator „równa się”. W celu wyjaśnienia:
$a == $b //Equal. TRUE if $a is equal to $b.
$a === $b //Identical. TRUE if $a is equal to $b, and they are of the same type.
Aby uzyskać więcej informacji, zobacz „ Operatory porównania ” w dokumentacji PHP online.
Mam nadzieję że to pomoże.
Różnice między tymi wartościami zawsze sprowadzają się do szczegółowych zasad specyficznych dla języka. To, czego nauczysz się w PHP niekoniecznie jest prawdą w przypadku Pythona, Perla, C, itp. Chociaż nauczenie się reguł dla języków, z którymi pracujesz, jest cenne, zbytnie poleganie na nich to proszenie się o kłopoty . Problem pojawia się, gdy następny programista musi utrzymywać twój kod i użyłeś jakiejś konstrukcji, która wykorzystuje kilka drobnych szczegółów Null vs. False (na przykład). Twój kod powinien wyglądać poprawnie (i odwrotnie, zły kod powinien wyglądać źle ).
Wartość Null jest używana w bazach danych do reprezentowania „brak rekordu” lub „brak informacji”. Więc możesz mieć pole bitowe, które opisuje "czy ten użytkownik chce, abyśmy wysyłali e-maile", gdzie True oznacza, że tak, False oznacza, że nie chcą, aby nic im wysyłano, ale Null oznaczałoby, że nie nie wiem. Mogą powstać przez połączenia zewnętrzne i tym podobne.
Logiczne implikacje wartości Null są często różne - w niektórych językach NULL nie jest niczym, więc if (a == NULL) zawsze będzie fałszywe.
Osobiście zawsze inicjowałbym wartość logiczną na FALSE, a inicjalizacja jednego na NULL wyglądałaby trochę obrzydliwie (nawet w C, gdzie oba są po prostu 0 ... tylko styl).
Myślę, że źli programiści znajdują różne zastosowania null / 0 / false w kodzie.
Na przykład jednym z najczęstszych błędów popełnianych przez programistów jest zwracanie kodu błędu w postaci danych z funkcją.
// On error GetChar returns -1
int GetChar()
To jest przykład interfejsu cukru. Jest to wyjaśnione w książce „Debuging the software development Proccess”, a także w innej książce „Pisanie poprawnego kodu”.
Problem z tym polega na implikacji lub założeniach dotyczących typu char. W niektórych kompilatorach typ char może być niepodpisany. Więc nawet jeśli zwracasz -1, kompilator może zamiast tego zwrócić 1. Tego rodzaju założenia kompilatora w C ++ lub C są trudne do zauważenia.
Najlepszym sposobem jest nie mieszanie kodu błędu z danymi. Więc następująca funkcja.
char GetChar()
teraz staje się
// On success return 1
// on failure return 0
bool GetChar(int &char)
Oznacza to, że bez względu na to, jak młody jest programista w twoim sklepie deweloperskim, nigdy nie zrozumie tego źle. Chociaż nie mówi to o redudancji lub zależnościach w kodzie.
Ogólnie rzecz biorąc, zamiana bool jako pierwszej klasy w języku jest w porządku i myślę, że Joel mówił o tym w swoim ostatnim postcastie. Ale staraj się nie używać funkcji mieszania i dopasowywania do danych w swoich procedurach, a wszystko powinno być w porządku.
W PHP zależy to od tego, czy walidujesz typy:
(
( false !== 0 ) && ( false !== -1 ) && ( false == 0 ) && ( false == -1 ) &&
( false !== null ) && ( false == null )
)
Technicznie null jest 0x00
w PHP ( null == 0x00 ) && ( null !== 0x00 )
.
0
jest wartością całkowitą.
Ciekawostka dotycząca NULL
PHP: Jeśli ustawisz zmienną na równą NULL
, jest to tak samo, jak gdybyś ją wywołał unset()
.
NULL
zasadniczo oznacza, że zmienna nie ma przypisanej wartości; false
Jest to ważna wartość logiczna, 0
jest prawidłową wartością całkowitą, a PHP ma kilka dość brzydkie konwersje pomiędzy 0
, "0"
, ""
, i false
.
Null to nic, False to trochę, a 0 to (prawdopodobnie) 32 bity.
Nie jest ekspertem od PHP, ale w niektórych bardziej nowoczesnych językach nie można ich używać zamiennie. Trochę mi brakuje, aby 0 i false były wymienne, ale ponieważ boolean jest rzeczywistym typem, możesz powiązać z nim metody i obiekty, więc to tylko kompromis. Null jest jednak zerowy, zasadniczo brak czegokolwiek.
Cóż, nie pamiętam wystarczająco dużo z moich dni w PHP, aby odpowiedzieć na część "===", ale dla większości języków w stylu C, NULL powinno być używane w kontekście wartości wskaźnika, false jako wartość logiczną, a zero jako wartość liczbowa, taka jak int. „\ 0” to zwyczajowa wartość kontekstu znakowego. Zwykle wolę też używać 0,0 do gier zmiennoprzecinkowych i podwójnych.
A więc ... szybka odpowiedź brzmi: kontekst.
Prawie we wszystkich współczesnych językach, logicznie null odnosi się do wskaźników (lub odniesień), które nie mają wartości lub do zmiennej, która nie została zainicjowana. 0 to liczba całkowita równa zero, a fałsz to wartość logiczna, cóż, fałsz. Aby skomplikować sprawę, na przykład w języku C wartości null, 0 i false są reprezentowane dokładnie w ten sam sposób. Nie wiem, jak to działa w PHP.
Następnie, aby jeszcze bardziej skomplikować sprawę, w bazach danych występuje koncepcja null, co oznacza brakujące lub nie nadające się do zastosowania, a większość języków nie ma bezpośredniego sposobu odwzorowania DBNull na ich wartość null. Na przykład do niedawna nie było rozróżnienia między wartością int będącą wartością zerową a zerową, ale zostało to zmienione za pomocą liczb całkowitych dopuszczających wartość null.
Przepraszam, że ten dźwięk jest skomplikowany. Tyle, że od lat jest to ostry punkt widzenia w językach, a do niedawna nigdzie nie miał żadnego wyraźnego rozwiązania. Ludzie zwykli po prostu łączyć ze sobą rzeczy lub robić puste lub 0 reprezentujące wartości null w bazie danych, co nie zawsze działa zbyt dobrze.
Fałsz i 0 są koncepcyjnie podobne, tj. Są izomorficzne. 0 to wartość początkowa algebry liczb naturalnych, a fałsz to wartość początkowa algebry Boole'a.
Innymi słowy, 0 można zdefiniować jako liczbę, która po dodaniu do jakiejś liczby naturalnej daje tę samą liczbę:
x + 0 = x
Podobnie Fałsz jest wartością taką, że jej dysjunkcja i każda inna wartość jest tą samą wartością:
x || False = x
Null jest koncepcyjnie czymś zupełnie innym. W zależności od języka istnieją różne semantyki, ale żadna z nich nie opisuje „wartości początkowej” jako Fałsz, a 0 tak. Nie ma algebry dla Null. Odnosi się do zmiennych, zwykle w celu wskazania, że zmienna nie ma określonej wartości w bieżącym kontekście. W większości języków nie ma żadnych operacji zdefiniowanych na wartości Null, a używanie wartości Null jako operandu jest błędem. W niektórych językach istnieje specjalna wartość o nazwie „bottom” zamiast „null”, która jest symbolem zastępczym dla wartości obliczenia, które się nie kończy.
Ktoś może mi wyjaśnić, dlaczego „NULL” nie jest tylko ciągiem znaków w przypadku porównania?
$x = 0;
var_dump($x == 'NULL'); # TRUE !!!WTF!!!
php > var_dump((int) "NULL"); // => int(0)
php > var_dump((int) "BLA"); // => int(0)
zobacz php.net/manual/en/language.operators.comparison.php Przetłumacz ciągi i zasoby na liczby, zwykła matematyka
Problemy z fałszywością pochodzą z historii PHP. Problem dotyczy słabo zdefiniowanego typu skalarnego.
'*' == true -> true (string match)
'*' === true -> false (numberic match)
(int)'*' == true -> false
(string)'*' == true -> true
Ścisłość PHP7 jest krokiem naprzód, ale może nie wystarczy. https://web-techno.net/typing-with-php-7-what-you-shouldnt-do/
null
i kiedyfalse
. I wolą używaćnull
podczas pobierania wartości z metody, ponieważ mogę użyćisset
w celu określenia, czy dana wartość jest zwracana zamiast używaniaempty
, które nie będzie uwzględniające:false
,0
,'0'
lub pusty ciąg znaków, który może być realne wartości w wielu sytuacjach. Dla mnie to najczystsze rozwiązanie w bałaganiarskiej konstrukcji.