Php fonksiyon argüman hata bastırma, boş () isset () öykünme

14 Cevap php

Ben bu sorunun cevabı hayır eminim, ama durumda bazı PHP guru var

Bir geçersiz argümanlar veya olmayan değişkenler geçirilen edilebilir şekilde ve php fonksiyon yazmak mümkün irade kullanımı olmadan hatası '@'

Boş ve isset yapmak gibi çok. Sen sadece yapılmış ve o hata olmaz bir değişken iletebilirsiniz.

ex:

boş ($ someBogusVar); / / Hata yok

myHappyFunction ($ someBogusVar); / / PHP uyarı / bilgi

14 Cevap

Özetle, doğru cevap no, you shouldn't (ihtar aşağıya bakınız).

Referans değişkenleri veya isset kullanmak gibi zaten bu thread birçok kişi tarafından belirtilen geçici çözümler, () veya boş () koşulları ve PHP yapılandırmasında baskılayarak bildirimler vardır. Bu istemediğiniz @ kullanarak bariz geçici çözüm, ek olarak.

Ilginç bir açıklama tartışmaları özetleyen Gerry: referans değişkeni geçirmeden gerçekten geçerli size check for the value of the variable inside the function ve düzgün tanımlanmamış veya boş davalarını eğer. Sadece (bu nerede benim orijinal olmamalıdır puan için) PHP kapattığım bir yolu olarak başvuru geçen kullanmayın.

Sen (PHP sessizce yeni bir değişken oluşturmak olacaktır) değişken başvuru tarafından geçirilen herhangi bir hata alamadım:

 function myHappyFunction(&$var)
 {       
 }

Ama programlama hatalarını gizleme için bu kötüye karşı tavsiye.

Öyle gibi func_get_args kullanarak bunu yapabilirsiniz:

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

function defaultValue() {
    $args = func_get_args();

    foreach($args as $arg) {
        if (!is_array($arg)) {
            $arg = array($arg);
        }
        foreach($arg as $a) {
            if(!empty($a)) {
                return $a;
            }
        }
    }

    return false;
}

$var = 'bob';

echo defaultValue(compact('var'), 'alpha') . "\n"; //returns 'bob'
echo defaultValue(compact('var2'), 'alpha') . "\n"; //returns 'alpha'
echo defaultValue('alpha') . "\n"; //return
echo defaultValue() . "\n";

Bu fonksiyon, bir adım daha ileri gider ve size args herhangi bir sayıda (her zaman iki args kadar sürebilir sadece onu zorlamak olabilir ama bu gibi bana daha yararlı, bu görünüm) ilk boş olmayan değer vermek istiyorum.

EDIT: Orijinal versiyonu args bir dizi denemek ve yapmak için kompakt kullanımı ve HALA bir hata verdi vermedi. Kompakt bir çentik ve bu yeni sürümü çarptı Hata raporlama biraz daha derli toplu olduğunu, ama yine de aynı şeyi yapar ve olmayan değişkenler için varsayılan bir değer sağlamak için sağlar.

Hayır, bu gerçekten fonksiyonu ile ilgisi olmadığı için; hata varolmayan bir dizi anahtarı-referansı de çalışırken geliyor. Bu hataları bastırılması için PHP kurulum uyarı düzeyini değiştirebilirsiniz, ama sadece bu yapmıyorum daha iyiyiz.

Eğer could gibi bir şey yapmak, o söyledikten sonra

function safeLookup($array, $key)
{
  if (isset($array, $key))
    return $array[$key];

  return 0;
}

Ve dizi anahtar arama yerine kullanmak

defaultValue(safeLookup($foo, "bar"), "baz);

Şimdi ben bir duş almak gerekir :)

Bir geçersiz argümanlar veya olmayan değişkenler geçirilen edilebilir şekilde ve php fonksiyon yazmak mümkün irade kullanımı olmadan hatası '@'

Yes you can!

porneL Doğru [değiştir: Ben onun cevabını veya bağlantı o kadar oy için yeterli puan yok, ama bu sayfada bulunuyor] olduğunu

O deyince o da doğru "Ama ben programlama hatalarını gizleme için bu kötüye karşı tavsiye." Hata Kontrol İşletmeni (@) üzerinden ancak hata bastırma da aynı bu nedenle kaçınılmalıdır.

Ben taşması Stack yeni değilim, ama doğru cevap hayır oy alırken bir sayfada üst sırada yer almak bir yanlış cevap için yaygın değil umuyoruz. (

There are valid cases where checking becomes cumbersome and unnessesary.
Therfore i've written this little magic function:

/**
 * Shortcut for getting a value from a possibly unset variable.
 * Normal:
 *   if (isset($_GET['foo']) && $_GET['foo'] == 'bar') {
 * Short:
 *   if (value($_GET['foo']) == 'bar') {
 *
 * @param mixed  $variable 
 * @return mixed  Returns null if not set
 */
function value(&$variable) {
    if (isset($variable)) {
    	return $variable;
    }
}

It doesn't require any changes karşı myHappyFunction().
You'll have karşı change

myHappyFunction($someBogusVar);

karşı

myHappyFunction(value($someBogusVar));

Açıkça niyet belirten. ki bu good practice benim kitapta yapar.

@ Brian: Benim için denetimi yapmak için bir Trinary işlemi kullanın:

return $value ? $value : $default;

Bu $ değer OR $ varsayılan döndürür ya. $ Değerinin değerine bağlı olarak. 0 ise, $ varsayılan yanlış, boş ya da benzeri bir şey değeri iade edilecektir.

Ben daha çok (boş gibi işlevleri taklit meydan için gidiyoruz) ve isset () ediyorum

@ Sean zaten Brian tarafından yanıtlandı That

return isset($input) ? $input : $default;

Sean, yapabilirsin:

$result = ($func_result = doLargeIntenseFunction()) ? $func_result : 'no result';

EDIT:

I'm sure there could be a great discussion on ternary operators vrs function calls. But the point of this question was to see if we can create a function that won't throw an error if a non existent value is passed in without using the '@'

Ve ben isset() ile kontrol, demiştim. Bir üçlü koşullu ilk bölümü null kontrol veya etmez, bunu denetler true veya false. Eğer PHP üzerinde null bir değer true veya false kontrol çalışırsanız, bu uyarıları almak. isset(), bir değişken veya ifade null değeri veya döner, ve herhangi bir hata olmadan üçlü ilk bölümü tarafından değerlendirilebilir bir boolean döndürür olup olmadığını denetler.

Ben üçlü operatörler VRS fonksiyon çağrıları üzerine büyük bir tartışma var olabilir eminim. Ama bu sorunun noktası biz olmayan bir değer kullanmadan geçirilir eğer bir hata atmak olmaz bir işlev oluşturabilirsiniz görmek oldu '@'

Asıl soruya cevabı "hayır" ise, hiç kimse bu sözü olan bir seçenek var.

Eğer @ işaretini kullandığınızda, tüm PHP error_reporting seviyesi geçersiz kılma ve geçici sıfıra ayarlıyor yapıyor. Geri @ kullanılmadan önce ne idiyse bunu ayarlamak için "ini_restore('error_reporting');" kullanabilirsiniz.

Bu benim kontrol ve değişken ayarlanmış olup olmadığını görmek için bir kolaylık işlevi yazmak istedim durumda benim için yararlı oldu, ve de diğer bazı özellikleri vardı, aksi takdirde, varsayılan bir değer döndürür. Ama, bu yüzden bu bastırmak için kullanılan @, neden bir PHP bildirim yoluyla bir tanımsız değişken göndererek, ancak daha sonra error_reporting geri işlevin içinde orijinal değerine ayarlayın.

Gibi bir şey:

$var = @foo($bar);

function foo($test_var)
{
     ini_restore('error_reporting');

     if(is_set($test_var) && strlen($test_var))
     {
          return $test_var;
     }
     else
     {
          return -1;
     }
}

$bar ayarlı değilse ben foo() çağırdığınızda Yani, yukarıdaki durumda, ben bir varolmayan değişken bir hata almazsınız. Ancak, ben yanlışlıkla is_set yerine isset yazdığınız işlev içinde bir hata alırsınız.

Bu yararlı orijinal soru ruhu ne sorduğunu kapsayan bir seçenek değilse, gerçekte olabilir.

Sadece parametreye bir varsayılan değer eklerseniz işlevi çağrılırken, bunu atlayabilirsiniz. Örneğin:

function empty($paramName = ""){
    if(isset($paramName){
        //Code here
    }
    else if(empty($paramName)){
        //Code here
    }
}

myHappyFunction($someBogusVar="");: tek bir hat ile, bunu başarırsınız yapabilirsiniz

Bu sizin için ne arıyorsanız umuyoruz. Eğer default argument values altında php belgeleri, okursanız, işlevleri kullanırken, bir işlevin argüman için bir varsayılan değer atayarak bir hata mesajı önlemeye yardımcı olduğunu görebilirsiniz.

Bu örnekte varsayılan bir argümanı kullanarak ve avantajları bulunuyor farkı görebilirsiniz:

PHP code:

<?php
function test1($argument)
{
    echo $argument;
    echo "\n";
}

function test2($argument="")
{
    echo $argument;
    echo "\n";
}

test1();
test1("Hello");
test1($argument);
$argument = "Hello world";
test1($argument);

test2();
test2("Hello");
test2($argument);
$argument = "Hello world";
test2($argument);
?>

Output for test1() hatları:

Warning: Missing argument 1 for test1() .
Hello.
.
Hello world.

Output for test2() hatları:

.
Hello.

Hello world.

Bu da ne istediğinizi gerçekleştirmek için isset() ve diğer işlevler için birlikte kullanılabilir.

Ve soyutlama ağacın daha fazla olacak kadar, sizin için bu ne kullanıyorsunuz?

Siz uygun şekilde her sınıfın bu değerleri başlatılamıyor veya benzeri tüm varsayılan değerleri ve nitelikleri içeren belirli bir sınıf oluşturmak olabilir ya:

class Configuration {

    private var $configValues = array( 'cool' => 'Defaultcoolval' ,
                                       'uncool' => 'Defuncoolval'  );

    public setCool($val) {
        $this->configValues['cool'] = $val;
    }

    public getCool() {
        return $this->configValues['cool'];
    }

}

Fikir kodunda aşağı yukarı her yerde defaultValue işlevini kullanırken bir değeri değiştirmek zorunda zaman, bu size bir defaultValue çağrı koyduk tüm yerler arıyoruz, bir bakım kabus olacak, bu varlık. Ve aynı zamanda, muhtemelen KURU ihlal, kendinizi tekrar için size yol olacak.

Bu tüm bu varsayılan değerleri depolamak için tek yerdir oysa. Siz bu belirleyiciler ve alıcılar yaratarak önlemek için cazip olabilir, ama onlar da durumda bu çıkışlar veya girişler doğrulama bazı değişiklik yapmak için ilgili becomse, bakım yardımcı olur.