Bana, iyi geliştiricilerin Null
ve False
ve 0
ve diğer tüm iyi "yok" varlıklar arasındaki farkı tespit edebileceği / kullanabileceği söylendi .
Ne olduğunu özellikle PHP farkı? Bununla bir ilgisi var ===
mı?
Bana, iyi geliştiricilerin Null
ve False
ve 0
ve diğer tüm iyi "yok" varlıklar arasındaki farkı tespit edebileceği / kullanabileceği söylendi .
Ne olduğunu özellikle PHP farkı? Bununla bir ilgisi var ===
mı?
Yanıtlar:
Null
" hiçbir şey " anlamına gelir . Var, başlatılmadı.
False
" boole bağlamında doğru değil " anlamına gelir . Mantıksal sorunlarla uğraştığınızı açıkça göstermek için kullanılır.
0
bir int
. Matematik için kullanılan yukarıdakilerle hiçbir ilgisi yok.
Şimdi, işin zor yanı, PHP gibi dinamik dillerde hepsinin boole bağlamında bir değeri var ki bu (PHP'de) False
.
Eğer ile test ederseniz ==
, boole değerini test eder, böylece eşitlik elde edersiniz. Eğer ile test ederseniz ===
, tipi test edecek ve eşitsizlik elde edeceksiniz.
Pekala, strrpos()
işleve bak . Hiçbir şey bulamadıysa False döndürür, dizenin başında bir şey bulmuşsa 0 döndürür!
<?php
// pitfall :
if (strrpos("Hello World", "Hello")) {
// never exectuted
}
// smart move :
if (strrpos("Hello World", "Hello") !== False) {
// that works !
}
?>
Ve tabii ki, eyaletlerle ilgilenirseniz:
DebugMode = False
(Kapalı olarak ayarlandı), DebugMode = True
(açık olarak ayarlandı) ve DebugMode = Null
(hiç ayarlanmadı ) arasında bir fark yaratmak istiyorsanız , zor hata ayıklamaya yol açacaktır ;-)).
null
olduğunu null
. false
olduğunu false
. Acı ama gerçek.
PHP'de çok fazla tutarlılık yoktur (en son sürümlerde gelişmesine rağmen, geriye dönük uyumluluk çok fazladır). Biraz tutarlılık isteyen tasarıma rağmen (burada seçilen cevapta özetlenmiştir), mantıklı false
/ kullanımı o null
kadar kolay olmayan yöntemlerle dönen yöntemi düşündüğünüzde her şey kafa karıştırıcı hale gelir .
Bir şey için zaten false kullandıklarında, genellikle null'un kullanıldığını göreceksiniz. örneğin filter_input (). Değişken filtreyi geçemezse yanlış döndürürler ve değişken yoksa null (mevcut değil, filtrede de başarısız olduğu anlamına gelir mi?)
Yanlış / null / string / etc'yi birbirinin yerine döndüren yöntemler, yazar hatanın türünü önemsediğinde bir hack'tir; örneğin, filter_input()
siz kontrol edebilirsiniz ===false
veya ===null
doğrulamanın neden başarısız olduğunu önemsiyorsanız. Ancak bunu yapmazsanız bir tuzak olabilir, ===null
çünkü yalnızca test senaryosunu yazmayı hatırlarlarsa , çeki eklemeyi unutabilirsiniz ===false
. Ve çoğu php birimi test / kapsam aracı eksik, test edilmemiş kod yolu için dikkatinizi çekmeyecektir!
Son olarak, işte tip hokkabazlık ile biraz eğlenceli. diziler veya nesneler dahil değil.
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
ve null == []
ama [] != 0
!!
strrpos('fail', 'search') will return false, and not null
bence doğrudur - eğer null
bilinmeyen anlamına geliyorsa , strrpos
geri dönmek null
, 'Dize orada değil' yerine 'dizenin orada olup olmadığını bilmiyorum' demek gibi olacaktır.
Aşağıda bir örnek verilmiştir:
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
PHP'de tür karşılaştırmaları hakkında daha fazla referans için lütfen buna bakın . Size net bir anlayış vermelidir.
PHP'de === ve! == operatörlerini yalnızca değerlerin eşit olup olmadığını değil, türlerinin eşleşip eşleşmediğini de kontrol etmek için kullanabilirsiniz. Örneğin: 0 == false
is true
, but 0 === false
is false
. Aynı şey !=
karşı için de geçerli !==
. Ayrıca null
, belirtilen operatörleri kullanarak diğer ikisiyle karşılaştırırsanız , benzer sonuçlar bekleyin.
Şimdi PHP'de bu değerlerin kalitesi genellikle bazen 0
(sıfır) olabilen bir değer döndürürken kullanılır , ancak bazen işlev başarısız olabilir. PHP'de bu tür durumlarda geri dönersiniz false
ve kimlik operatörünü kullanarak bu durumları kontrol etmeniz gerekir ===
. Örneğin, bir dizenin diğerinin içinde bir konumunu arıyorsanız ve kullanıyorsanız strpos()
, bu işlev dize en başında bulunursa 0 olabilecek sayısal konumu döndürür, ancak dize şu konumda bulunmazsa hepsi, sonra strpos()
geri dönecek false
ve sonuçla uğraşırken bunu hesaba katmalısınız.
İşlevlerinizde aynı tekniği kullanacaksanız, standart PHP kitaplığına aşina olan herhangi biri, neler olup bittiğini ve döndürülen değerin istenen değer olup olmadığını veya işlem sırasında bir hata olup olmadığını nasıl kontrol edeceğini anlayacaktır. Aynısı işlev parametreleri için de geçerlidir, diziler mi yoksa dizgeler mi olduğuna bağlı olarak bunları farklı şekilde işleyebilirsiniz ve bu teknik PHP'de de yoğun bir şekilde kullanılır, bu nedenle herkes bunu kolayca elde eder. Sanırım güç bu.
False, Null, Nothing, 0, Undefined , vb.
Bunların her birinin, gerçek kavramlarla ilişkili belirli anlamları vardır. Bazen birden fazla anlam, tek bir anahtar kelimeye veya değere aşırı yüklenir.
Olarak C ve C ++ , NULL
, False
ve 0
aynı değere aşırı yük. In C # , 3 farklı kavramları konum.
null
veya NULL
genellikle değer eksikliğini gösterir, ancak genellikle nedenini belirtmez.
0
sıfır doğal sayıyı gösterir ve 1, 2, 3 vb. tür eşdeğerine sahiptir ve ayrı kavramları destekleyen dillerde NULL
sadece bir sayı olarak ele alınmalıdır.
Yanlış , gerçek olmayanı gösterir. Ve ikili değerlerde kullanıldı . Bu, ayarlanmadığı anlamına gelmez, ne anlama gelir 0
? Basitçe iki ikili değerden birini gösterir.
Hiçbir şey, değerin, null ile aynı şeyi gösteren, ancak niyetle özel olarak hiçbir şey olarak ayarlandığını gösteremez.
Bazı dillerde tanımsız, hiçbir kodun gerçek bir değer belirtmemesi nedeniyle değerin henüz ayarlanmaması gerektiğini gösterir.
Sadece ya bir almaya çalışırken günde 1/2 boşa 0
, null
, false
döndürülecek strops
!
Mantığın doğru yönde akmadığını, php kodlamada bir kara delik varmış gibi görünmeden önce yapmaya çalıştığım tek şey şuydu:
Konsept, bir sunucuda barındırılan bir alan adını alır ve kök düzeyinde olmadığından emin olun, Tamam, bunu yapmanın birkaç farklı yolu, ancak yaptığım diğer php işlevleri / yapıları nedeniyle farklı seçtim.
Her neyse, burada cosing'in temeli şuydu:
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";
}
}
SONUNDA bu Konuyu okuduktan sonra, bunun işe yaradığını buldum !!!
{
if ((mydomain.co.uk, mydomain)) !== false )
{
echo "\n5 is True";
} else {
echo "\n5 is False";
}
}
Bu yazı için teşekkürler, şimdi anlıyorum ki Noel olsa da, Noel de olmayabilir false
, çünkü bir NULL
gün de olabilir !
Basit bir kodda hata ayıklamakla geçen bir günü boşa harcadıktan sonra, keşke bunu daha önce bilseydim, çünkü her yere gidip onu çalıştırmaya çalışmak yerine sorunu tanımlayabilecektim. O değil iş, olarak yaptığımız False
, NULL
ve 0
tüm olmayan aynı True or False or NULL
?
Gönderen PHP online belgeler :
Bir değeri açıkça boolean'a dönüştürmek için (bool) veya (boolean) dönüşümlerini kullanın.
Bununla birlikte, çoğu durumda çevrim gereksizdir, çünkü bir operatör, işlev veya kontrol yapısı bir boole argümanı gerektirdiğinde bir değer otomatik olarak dönüştürülecektir.
Boole'ye dönüştürürken aşağıdaki değerler YANLIŞ olarak kabul edilir:
FALSE
kendisi 0.0
(sıfır) "0"
NULL
(ayarlanmayan değişkenler dahil) TRUE
(herhangi bir kaynak dahil). Yani çoğu durumda aynıdır.
Öte yandan, ===
ve ==
aynı şey değildir. Düzenli olarak, sadece "eşittir" operatörüne ihtiyacınız vardır. Netleştirmek için:
$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.
Daha fazla bilgi için, PHP çevrimiçi belgelerinde " Karşılaştırma Operatörleri " sayfasına bakın.
Bu yardımcı olur umarım.
Bu değerler arasındaki farklar her zaman ayrıntılı dile özgü kurallara bağlıdır. PHP için öğrendikleriniz Python, Perl veya C, vb. İçin mutlaka doğru değildir. Çalıştığınız dil (ler) için kuralları öğrenmek değerli olsa da, onlara çok fazla güvenmek sorun istemektir . Sorun, bir sonraki programcının kodunuzu korumaya ihtiyacı olduğunda ve siz (örneğin) Null ve False'ın bazı küçük ayrıntılarından yararlanan bazı yapılar kullandığınızda ortaya çıkar. Kodunuz doğru görünmelidir (ve tersine, yanlış kod yanlış görünmelidir ).
Null, veritabanlarında "kayıt yok" veya "bilgi yok" ifadelerini temsil etmek için kullanılır. Bu nedenle, "bu kullanıcıya bizim tarafımızdan e-posta gönderilmesini istiyor mu" şeklinde bir alanınız olabilir, burada True bunu yapar, False hiçbir şey gönderilmesini istemedikleri anlamına gelir, ancak Boş, istemediğiniz anlamına gelir. bilmiyorum. Dış birleşimlerde ve benzeri şekillerde ortaya çıkabilirler.
Null'un mantıksal çıkarımları genellikle farklıdır - bazı dillerde NULL hiçbir şeye eşit değildir, dolayısıyla if (a == NULL) her zaman yanlış olacaktır.
Şahsen ben her zaman bir boolean FALSE olarak başlatırdım ve birini NULL'a başlatmak biraz garip görünebilir (ikisinin de sadece 0 olduğu C'de bile ... sadece bir stil şeyi).
Bence kötü geliştiriciler, kodda null / 0 / false'ın tüm farklı kullanımlarını buluyor.
Örneğin, geliştiricilerin yaptığı en yaygın hatalardan biri, hata kodunu bir işleve sahip veri biçiminde döndürmektir.
// On error GetChar returns -1
int GetChar()
Bu bir şeker ara yüzü örneğidir. Bu, "Yazılım geliştirme işleminde hata ayıklama" kitabında ve ayrıca "doğru kod yazma" adlı başka bir kitapta açıklanmıştır.
Bununla ilgili sorun, char türüne yapılan ima veya varsayımlardır. Bazı derleyicilerde char türü imzasız olabilir. Yani -1 döndürseniz bile derleyici bunun yerine 1 döndürebilir. C ++ veya C'deki bu tür derleyici varsayımlarını tespit etmek zordur.
Bunun yerine, en iyi yol, hata kodunu verilerinizle karıştırmamaktır. Yani aşağıdaki işlev.
char GetChar()
şimdi olur
// On success return 1
// on failure return 0
bool GetChar(int &char)
Bu, geliştirme mağazanızdaki geliştirici ne kadar genç olursa olsun, bunu asla yanlış yapmayacağı anlamına gelir. Gerçi bu fazlalıktan veya koddaki bağımlılıklardan bahsetmiyor.
Yani genel olarak, dilde birinci sınıf türü olarak bool'u değiştirmek sorun değil ve bence Joel son yayınında bundan bahsetti. Ancak rutinlerinizde verilerinizle boolleri karıştırıp eşleştirmemeye çalışın ve tamamen iyi olmalısınız.
PHP'de türleri doğrulamanıza bağlıdır:
(
( false !== 0 ) && ( false !== -1 ) && ( false == 0 ) && ( false == -1 ) &&
( false !== null ) && ( false == null )
)
Teknik olarak null, 0x00
ancak PHP'de ( null == 0x00 ) && ( null !== 0x00 )
.
0
bir tamsayı değeridir.
NULL
PHP ile ilgili ilginç bir gerçek : Bir var değerini 'a eşitlerseniz NULL
, onu çağırmışsınız gibi aynıdır unset()
.
NULL
esasen bir değişkenin kendisine atanmış bir değeri olmadığı anlamına gelir; false
Geçerli bir Boole değeri, 0
geçerli bir tamsayı değeridir ve PHP arasındaki oldukça çirkin dönüşümü bulunmayan 0
, "0"
, ""
, ve false
.
Null hiçbir şeydir, False birazdır ve 0 (muhtemelen) 32 bittir.
Bir PHP uzmanı değil, ancak daha modern dillerin bazılarında bunlar birbirinin yerine geçemez. 0'a sahip olmayı özledim ve yanlış birbirinin yerine geçebilir, ancak boolean gerçek bir tür olduğundan, onunla ilişkili yöntemlere ve nesnelere sahip olabilirsiniz, bu sadece bir değiş tokuş. Null null olsa da, esasen hiçbir şeyin olmaması.
Pekala, PHP günlerimden "===" bölümünü yanıtlayacak kadar hatırlayamıyorum, ancak çoğu C-stili dil için işaretçi değerleri bağlamında NULL kullanılmalı, boolean olarak false ve sıfır olarak int gibi sayısal değer. '\ 0' bir karakter bağlamı için geleneksel değerdir. Ben genellikle şamandıralar ve çiftler için 0.0 kullanmayı tercih ederim.
Yani .. hızlı cevap: bağlam.
Hemen hemen tüm modern dillerde, mantıksal olarak boş bir değere sahip olmayan işaretçiler (veya referanslar) veya başlatılmamış bir değişken anlamına gelir. 0, sıfırın tamsayı değeridir ve yanlış, yanlışın boole değeridir. İşleri karmaşık hale getirmek için, örneğin C'de null, 0 ve false aynı şekilde temsil edilir. PHP'de nasıl çalıştığını bilmiyorum.
Daha sonra, işleri daha da karmaşıklaştırmak için, veritabanlarının bir boş kavramı vardır, bu da eksik veya uygulanamaz anlamına gelir ve çoğu dilin bir DBNull'u boş değerlerine eşlemek için doğrudan bir yolu yoktur. Örneğin yakın zamana kadar, bir int'in null olmasıyla sıfır olması arasında bir fark yoktu, ancak bu, null yapılabilir ints ile değiştirildi.
Bu sesi karmaşık hale getirdiğim için üzgünüm. Sadece bu, yıllarca dillerde harry pes noktası oldu ve yakın zamana kadar hiçbir yerde net bir çözüme sahip değildi. Eskiden insanlar bir şeyleri bir araya getirir ya da boş bırakır ya da 0, veritabanındaki boş değerleri temsil eder ve bu her zaman çok iyi çalışmaz.
False ve 0 kavramsal olarak benzerdir, yani izomorfiktirler. 0, doğal sayıların cebiri için başlangıç değeridir ve False, Boole cebri için başlangıç değeridir.
Başka bir deyişle, 0, bir doğal sayıya eklendiğinde aynı sayıyı veren sayı olarak tanımlanabilir:
x + 0 = x
Benzer şekilde False, kendisinin ve diğer herhangi bir değerin kesişiminin aynı değer olduğu bir değerdir:
x || False = x
Boş, kavramsal olarak tamamen farklı bir şeydir. Dile bağlı olarak, onun için farklı anlamlar vardır, ancak hiçbiri "başlangıç değerini" False ve 0 olarak tanımlamaz. Null için cebir yoktur. Değişkenlerle ilgilidir, genellikle değişkenin geçerli bağlamda belirli bir değeri olmadığını belirtmek için. Çoğu dilde, Null üzerinde tanımlanmış hiçbir işlem yoktur ve Null'u bir işlenen olarak kullanmak bir hatadır. Bazı dillerde, sona ermeyen bir hesaplamanın değeri için yer tutucu olan "boş" yerine "alt" adı verilen özel bir değer vardır.
NULL'un etkileri hakkında başka yerlerde daha kapsamlı yazdım.
Biri bana 'NULL'un neden bir karşılaştırma örneğindeki bir dize olmadığını açıklayabilir?
$x = 0;
var_dump($x == 'NULL'); # TRUE !!!WTF!!!
php > var_dump((int) "NULL"); // => int(0)
php > var_dump((int) "BLA"); // => int(0)
bkz. php.net/manual/en/language.operators.comparison.php Dizeleri ve kaynakları sayılara
Hatalılıkla ilgili sorunlar PHP geçmişinden gelir. Sorun, iyi tanımlanmamış skaler türü hedefliyor.
'*' == true -> true (string match)
'*' === true -> false (numberic match)
(int)'*' == true -> false
(string)'*' == true -> true
PHP7 katılığı ileri bir adımdır, ancak yeterli olmayabilir. https://web-techno.net/typing-with-php-7-what-you-shouldnt-do/
null
ve ne zaman kullandığınızda TUTARLI olmanız önemlifalse
. Ben kullanmayı tercihnull
bir yöntem arasında bir değer alırken ben kullanamaması içinisset
bir değer kullanmak yerine döndürülür olmadığını belirlemek içinempty
: hesapta almayacağız hangifalse
,0
,'0'
veya boş bir dize, pek çok durumda değişkenlik değerleri olabilen. Bana göre dağınık bir yapıda en temiz çözüm.