PHP Zayıf yazarak: neden bütün isset kullanabilir?

9 Cevap php

Benim kod ben yaparsam null denetlemek için çalışır gibi görünüyor

if ($tx)

veya

if (isset($tx))

yazmak için zor olduğunda neden ikinci bir yapardınız?

9 Cevap

Ben burada okudum herkesin cevaplanması bir ihtar ilave olması gerektiğini işaret etmek istiyorum:

"isset() will return FALSE if testing a variable that has been set to NULL" (php.net/isset).

Bu bir dize olacak, ya da olmayacak, çünkü some durumlarda,) (isset kullanarak, bir GET veya POST parametre için kontrol gibi (değişken ayarlanmış olup olmadığını söylemek için yeterli olduğu anlamına gelir ) ayarlayın. Ancak, null nesnelerin ve daha karmaşık uygulamalar içine almak zaman oldukça yaygın olan bir değişken, isset için olası bir değer olduğu durumlarda () yüksek ve kuru bırakır.

(Örneğin: 17 Ağustos 2008 09:05:31) yerleşik Suhosin-Patch 0.9.6.2 (cli) (PHP ile 5.2.6 ile test edilmiştir):

<?php
$a = '';
$b = NULL;
var_dump(isset($a));
var_dump(isset($b));
var_dump(isset($c));

çıkışlar:

bool(true)
bool(false)
bool(false)

Teşekkürler, PHP!

if ($tx)

Bu kod any aşağıdaki koşullardan için false değerlendirecektir:

unset($tx); // not set, will also produce E_WARNING
$tx = null;
$tx = 0;
$tx = '0';
$tx = false;
$tx = array();

Aşağıdaki kodu yalnızca aşağıdaki koşullar altında yanlış olarak değerlendirir:

if (isset($tx))

// False under following conditions:
unset($tx); // not set, no warning produced
$tx = null;

Bazı insanlar için, yazarak çok önemlidir. Ancak, tasarım PHP değişken türleri ile çok esnek. Variable Handling Functions yaratıldı nedeni budur.

isset() has nothing to do with TYPE veyaVALUE - only with EXISTENCE.

($ koşul) ... mantıksal bir değer olarak VALUE OF THE VARIABLE değerlendirir eğer.

(isset ($ koşul)) ... boolean olarak EXISTENCE OF THE VARIABLE VALUE değerlendirir eğer.

isset () iki nedenden dolayı yanlış olabilir.

Öncelikle, değişken ayarlı değil çünkü, ve böylece hiçbir değeri yoktur.

İkincisi, bir değişken "bilinmeyen bir değeri" anlamına gelir, NULL ve "hiçbir değeri" içerir çünkü set olarak kabul edilemez, çünkü bu kadar çok insan aynı şey olarak tanımsız demek $ v = null kullanın çünkü ($ v).

(Özellikle null kontrol etmek istiyorsanız) (is_null kullanın, unutmayın.)

isset () genellikle veya yok olabilir harici bir değişkeni kontrol etmek için kullanılır.

Eğer page.php adlı bir sayfa varsa Örneğin, bu var:

ini_set('display_errors', 1);
error_reporting(E_ALL);

if ( $_GET["val"] ) {
    // Do Something
} else {
    // Do Nothing
}

bu URL'ler için herhangi bir ok çalışacaktır:

http://www.example.com/page.php?val=true // Something will be done.
http://www.example.com/page.php?val=monkey // Something will be done.

http://www.example.com/page.php?val=false  // Nothing will be done.
http://www.example.com/page.php?val=0// Nothing will be done.

Ancak, bu URL için bir hata alırsınız:

http://www.example.com/page.php

URL hayır 'Val' argüman var, yani $ _GET dizisinde hayır 'Val' dizin olduğundan.

: Bu yapmak için doğru yolu gibi

if ( isset($_GET["val"]) ) {
    if ( $_GET["val"] ) {
        // Do Something
    } else {
        // Do Nothing
    }
} else {
    // $_GET["value"] variable doesn't exist.  It is neither true, nveyafalse, nveyanull (unknown value), but would cause an errveyaif evaluated as boolean.
}

Bunun için kısayollar var olmasına rağmen.

Sen boş ile varlığını ve bazı Boole koşulların bir kombinasyonu için (kontrol edebilirsiniz),

if ( !empty($_GET["val"]) ) {
    // Do someting if the val is both set and not empty
    // See http://php.net/empty fveyadetails on what is considered empty
    // Note that null is considered empty.
}

veya

if ( isset($_GET["val"]) and $_GET["val"] ) {
    // Do something if $_GET is set and evaluates to true.
    // See php.net logical operators page fveyaprecedence details,
    // but the second conditional will never be checked (and therefor
    // cause no error) if the isset returns false.
}

İlki yalnızca sunucu nasıl yapılandırıldığına bağlı olarak çalışır. Birçok üretim sunucularında, kıracak.

Kullan isset() ve neşeli olma.

Veya, PHP kaynağının üstünde aşağıdaki ile kodunuzu deneyin ve onu kırmak izle:

ini_set('display_errors', 1);
error_reporting(E_ALL);

Eski zamanda veya istemiyor olabilir ki, doğru / yanlış kontrol çünkü.

Basitçe, bu karşılaştırma aynı değildir. İlk boş diziler, sayısal olmayan dizeler ve değişken kesinlikle ayarlanmış olduğu diğer kontroller, ilgili onay başarısız, hangi bir mantıksal değişken döküm olacaktır. Ikinci çek değişken hiç var olup olmadığını (isset ()) testleri.

Ben de değişkenin türünü kontrol etmeden ilk onay (boolean cast) gerçekleştirmek asla.

Söz değil, ilk onay bir E_NOTICE atmak olacaktır, ve ben her zaman maksimum hata raporlama düzeyde ile çalıştırın.

İlk bir uyarı üretir ve aynı zamanda gerçek dönecektir, çünkü eğer tanımlı değil gibi aynı değildir $ tx === false,

These two are quite different, as every single answer has pointed out. If you do not use isset, many things will evaluate to false, especially arrays, values of false, numeric values of 0 (and others), etc. True that.

Herkesin PHP correct programlama savunmak için çok hızlı olduğunu bana garip görünüyor. Ben doğru programlama yapmak istiyorsanız, ben bunu yapmak için statik olarak yazılan, kesinlikle yazılan dillerin tonlarca var. PHP bir avantaj ben çok türleri hakkında düşünmek zorunda kalmamasıdır gibi geliyor bana. Tabii, durumlar vardır nerede

if ($tx)

aslında bir değere sahip yaptığında yanlış değerlendirilirse, ancak if it's a Transaction Object or not kontrol etmek istiyorsanız, bu eserler ya da değil ya. Bu çıkıyor, bu Doktrini çerçevesinde, bu kod ile

if (isset($tx))

her zaman bir sorgunun ilk nesneyi kapma sonra true değerlendirir. Bunun yerine söylemek zorunda

if ($tx instanceof PurchaseRecord)

Yani benim açımdan PHP, sizin için test yapıyorlar biliyor olmasıdır! Bir GET isteği bir parametre ise Örneğin, bu ya, boş boş olması, ya da bir değere sahip olacaktır. Sen bu üç davalarını gerekir. Ya da iki olgu, ya da ne olursa olsun size özel kod var vaka sayısı. Once you have, if it works on your development server and it works on your production server, maybe you can say that it works and get on with your life?

(Java veya C #, bu derleme ve ardından İstisnalar atma olmadan çalıştırmak zorundadır Java En NullPointer istisnalar aslında hiçbir sorunlara neden olması ile atılmış olsun:. Çünkü onun Java API'leri belki de imkansız çünkü kod tüm null kontrol edemez ve hiçbir derler ve bu gerekiyordu zaman çalışırsa sorun., sizin kod tamam biliyorum. Sonra sonra daha doğru İstisnalar atma konusunda endişe edebilirsiniz.)

If at all points you have to know what the underlying types of your code in PHP, why not code using types in the first place? Or more to the point, why not take advantage of the looseness of PHP and code with code that runs.

Ayrıca önemli PHP bir dize ayarlanır ancak boş olabileceğini unutmayın. Dize şey olsa bile bu yüzden isset ben isset değiştirmek için böyle bir fonksiyon şey kullanmak, bu önlemek için, doğru dönecekti:

<?php
    function exists($var) {
        if (isset($var) && $var != "") {
        	return true;
        } else {
        	return false;
        }
    }
?>