PHP: Bir değer olarak atanan eğer bir işlev biliyor musun?

6 Cevap php

Diğer bir deyişle, fn() o $var = fn(); yerine fn(); olarak kullanıldığını bilebilir?

Bir kullanım durumu ikinci durumda echo dönüş değerine ancak return bunu eski içinde olacaktır.

Bu da kullanılıyor hangi yolu beyan işlevine bir parametre geçirerek olmadan yapılabilir mi?

6 Cevap

Birçok PHP fonksiyonları $ dönüş doğruysa değeri döndürür, ya $ dönüş false ise değeri yazdırır $ dönüş olarak adlandırılan bir Boole değeri ileterek bunu. Örnek bir çift print_r() ve highlight_file() vardır.

Yani fonksiyon aşağıdaki gibi görünecektir:

function fn($return=false) {
    if ($return) {
        return 'blah';
    } else {
        echo 'blah';
    }
}

Başka yolu iyi programlama tarzı olmayacaktır.

Hayır, ve olmamalıdır. Bu işlevler kullanıldığı bağlam habersiz dili oldukça temel dayanak noktası. Her bölüm (fonksiyon) çevresinden tamamen izole olmasıdır, uygulamanızı ayrıştırmak için izin verir.

Yani ne bu özel kullanım-dava hakkında yapabilirim çıktı tamponunun üzerinde tturn olduğunu söyledi. Varsayılan olarak echo stdout veri gönderebilir, ancak bunun yerine bir değişken çıkış yakalamak hangi bir tampon ayarlayabilirsiniz. Örneğin:

function foo() {
  echo "Hello World";
}
foo(); // will output "Hello World"
ob_start();
foo();
$foo = ob_get_clean(); // will assign the string "Hello World" into the variable $foo

Buna ek olarak, bu fonksiyonları genellikle doğrudan çıkış için kötü bir tür olarak kabul edilir. Genellikle bir dize döndürmek ve çıkış için komut dosyası üst düzeyde bırakmalısınız. İdeal tüm uygulama sadece tek bir echo ifadesi olmalıdır.

Sadece tercüman bu deyim yürütür nasıl düşünmek:

$var = fn();

Tercüman işlenen değerlendirir sağdan sola atama operatörü ile, bu yüzden ilk önce sağ taraftaki ifadeyi değerlendirir (fn() bu durumda) ve daha sonra sonucu atar {[(1) }]. Her ifadenin bir değer döndürür ve bu değer ile ne yapmak sizin seçiminiz.

Hayır, onu bulmak için hiçbir yolu yoktur. Yapabileceğin tek şey, (http://it2.php.net/debug_backtrace) çağrı yığınını kapmak ve onu kontrol etmektir.

Hayır, yapamam.

Kolayca yüzden, yapılabilir ama değil ne sadece işlevi için ekstra bir boolean değişkeni geçtiyseniz? Bu şekilde, fonksiyonun sonu gibi görünecektir:

if (namespace) {
    return $output;
} else {
    echo $output;
}

Oldukça basit bir çözüm gibi görünüyor.