2009-03-09 18 views
25

arasındaki farklar nedir Boş değerler istediğimde böyle şeyler ayarlamak için kullanılır.PHP'de, NULL ve bir dize eşit 2 tek tırnak

$blankVar = ''; 

Birkaç ay sonra, bunun daha iyi göründüğüne ve daha net bir niyete sahip olduğuna karar verdim.

$blankVar = null; 

Bu

bir süre hıçkırık çalıştı, ancak son zamanlarda bir PDO ile ben bir sorunla karşılaştık ifadeleri hazırladı. Sorguyu geçersiz kılan bir değerin bağlanması başarısız olurken, '' değil. Bunu null'a bağlamak zorundaydım, böylece bir koşul karşılandığında boş veri ekleyecekti.

2 arasındaki farklar nelerdir? Hala null (ya da en azından sabit) daha iyi görünüyor diye düşünüyorum, bunu yapmalı mıyım?

define('EMPTY', ''); 

cevap

41

Null, PHP'de yalnızca bir değeri olan (null) başka bir veri türüdür. PHP gevşek bir şekilde yazılmış bir dil olduğundan, farklı değerleri nasıl işleyeceği konusunda kafa karıştırıcı olabilir. PHP'de False olarak kabul edilir. Bununla birlikte, null, farklı bir tür hayvandır. Null kullanılarak ana uyumsuzluğu, isset() olup olmadığını söyleyemezsiniz.

$x = false; 
isset($x) -> true 
echo $x -> "" 

$y = null; 
isset($y) -> false 
echo $y -> "" 

//$z is not set 
isset($z) -> false 
echo $z -> E_NOTICE 

Yani boş PHP'de (en azından bazı) Normal değişken kurallara uymaz anlamda garip. Çoğu durumda, bu iyidir.

Veritabanı sütunları söz konusu olduğunda, PHP'nin NULL'sunun orada bir yeri yoktur. Görüyorsunuz, SQL dize tabanlı bir dildir. SQL'in NULL değeri, tırnak işareti olmadan NULL ile temsil edilmelidir.

Yani bir BOŞ alanı istiyorsanız,

INSERT INTO foo SET bar = "" 

"" olarak ayarlanmış Ama bir NULL alan isterseniz,

INSERT INTO foo SET bar = NULL 

BÜYÜK FARK NULL olarak ayarlayın.

Ancak, PHP NULL'unu doğrudan eklemeyi denerseniz, sorguya sıfır karakter ekleyecektir (bu da size alıntı yapmanıza bağlı olarak boş veya sözdizimi hatası verir).

+2

SQL'inizi bölümünüze eklediğiniz için teşekkür ederiz. – alex

19

boş anlamıyla "hiçbir şey" anlamına programlama dilinde özel bir yer tutucu değerdir. 0 değil, boş bir ip değil, hiçbir şey. Bellekte işaret edilen bir değer yoktur. Öte yandan boş bir dize hala bir string nesnesidir, sadece çok kısa bir tane var :)

+1

Teşekkürler Rex, bu en açık cevap (yine de bana). – alex

+0

Eğer bu en açık cevapsa ve kabul ediyorum, neden kabul etmediniz? –

+0

@Chris: Kabul ettiğim kişi bana daha fazla bilgi verdi .. Bunun yerine buna oy verdim. – alex

2

Her bir yaklaşımın ne kadar hoş göründüğü bir şeydir, ama asıl fark, birinin boş bir dizgedir. diğer başlatılmamış değişken (null) Rex tarafından belirtilen farklılıklardan Kenara

2

olduğunu gevşek ve sıkı PHP'de karşılaştırmalar iki tür, var:

http://www.php.net/manual/en/types.comparisons.php

Eğer sıkı karşılaştırmalar veya is_null gibi fonksiyonları() Herhangi bir kapasitede kullanılır, farklı sonuçlar elde edersiniz. Ancak, gevşek karşılaştırmalar ile PHP oldukça hoştur.

Elbette emin değilim, ancak null yaklaşımınızı kullanabiliyorsunuz, sonra değişkeni kullandığınız bağlamda (örneğin, pass (string) $ blankVar) kullandığınızda sadece bir klavyeyi yazabilirsiniz. Bu çalışırsa, kodunuz için daha az değişiklik gerekli olabilir.

+0

Bu yararlı görünüyor, bu yüzden eğer bir şeyleri null olarak ayarlamaya devam edersem ve bir hıçkırığım varsa, sadece $ var = (string) $ myPossiblyNullString; ? – alex

+0

PHP zayıf yazılmıştır, bu yüzden bu tür şeyler genellikle işe yarıyor, ama ben kendim denemedim. –

1

'null', başlatılmamış değişkenlerin başvurduğu benzersiz bir şeydir. Null'a başvurmak için bir değişken ayarlayabilirsiniz. Ayrıca, değişkenin var olmadığı anlamına gelen 'unset' durumu da vardır. Bunu isset() function aracılığıyla kontrol edebilirsiniz. Çoğu zaman, bir dizi elemanının mevcut olup olmadığını kontrol etmek için kullanılır ve örneğin $ _GET ['op'] 'un bir querystring paramını alıp almadığını görmek için kullanılır. Ayrıca unset() function aracılığıyla bir değişkeni (dizinin bir öğesini kaldırın) de yapabilirsiniz. Ayrıca, bir değişkenin NULL, FALSE, 0 veya boş bir dize olup olmadığını kontrol edecek bir function empty() vardır.

İlgili konular