PHP iç içe işlevleri nelerdir?

7 Cevap php

JavaScript iç içe fonksiyonlar çok kullanışlıdır: kapanışları, özel yöntemler ve ne varsa ..

Için iç içe PHP fonksiyonları nelerdir? Herkes onları kullanmak ve ne için mi?

İşte yaptım küçük bir soruşturma bulunuyor

<?php
function outer( $msg ) {
    function inner( $msg ) {
        echo 'inner: '.$msg.' ';
    }
    echo 'outer: '.$msg.' ';
    inner( $msg );
}

inner( 'test1' );  // Fatal error:  Call to undefined function inner()
outer( 'test2' );  // outer: test2 inner: test2
inner( 'test3' );  // inner: test3
outer( 'test4' );  // Fatal error:  Cannot redeclare inner()

7 Cevap

Temelde orada yok, ben her zaman ayrıştırıcı bir yan etkisi olarak, bu tedavi ettik.

Eran Galperin onlar outer() çalıştırılan kadar sadece bildirilmemiş olup, bu işlevler bir şekilde özel olduğunu yanlış. Onlar da özel kapsamlı değildir, onlar gecikmeli de olsa küresel kapsamını kirletmez yok. Ve bir geri olarak dış arama hala sadece bir kez denilebilir. Ben yine de çok büyük olasılıkla birden fazla kez takma çağıran bir dizi üzerine uygulayarak yararlı olur nasıl görmüyorum.

Bulabildiğim tek 'gerçek dünya' örnek this sadece bir kez çalıştırın ve temiz IMO yeniden yazılamaz olabilir hangi.

Modülleri ile birlikte, küresel alanda birçok iç içe geçmiş yöntemleri belirlemektedir a [name] _include yöntemi çağırmak için aklıma sadece kullanımı

if (!function_exists ('somefunc')) {
  function somefunc() { }
}

denetler.

PHP'nin OOP açıkçası daha iyi bir seçim olurdu :)

PHP 5.3 kullanıyorsanız, anonim bir fonksiyonu ile daha Javacript-benzeri davranış alabilirsiniz:

<?php
function outer() {
    $inner=function() {
        echo "test\n";
    };

    $inner();
}

outer();
outer();

inner(); //PHP Fatal error:  Call to undefined function inner()
$inner(); //PHP Fatal error:  Function name must be a string
?>

Çıktı:

test
test

Fonksiyonların içinde tanımlanan fonksiyonlar elimden ancak koşullu tanımlı işlevler için çok kullanmak göremiyorum. Örneğin:

if ($language == 'en') {
  function cmp($a, $b) { /* sort by English word order */ }
} else if ($language == 'de') {
  function cmp($a, $b) { /* sort by German word order; yes it's different */ }
} // etc

Ve sonra kod yapması gereken tüm usort gibi şeyler 'cmp' function () çağırır kullanın böylece tüm kod üzerinden değil çöp dil ​​denetimlerini yapmak. Şimdi bu yapmadım ama bunu yapmak için değişkenleri görebilirsiniz.

Benim php Tüm OO, ancak işlevi mutlaka bir nesne özyinelemeli değildir ve özellikle ben, iç içe işlevler için kullanılmasını görüyorum. Yani o iç içe fonksiyon dışında denir almaz, demek ki, ama özyinelemeli ve daha sonra bir fonksiyon olması gerekir.

Tek bir diğer yöntem ekspres kullanımı için yeni bir yöntem yapımında küçük bir nokta var. Benim için o beceriksiz kod ve OO tür-noktası değil. Eğer başka bir yerde bu işlevi çağırmak için asla eğer, yuva onu.

Webcoder çağrı olarak biz bunu dinamik bir iç içe geçmiş bir şekilde dahil çok daha düşük yükü (bellek ve hız) bulundu, fonksiyonların 1000'ler dolu kütüphaneler üzerine tek tek fonksiyonlar. 5-10 derin sadece megabayt dahil daha dinamik bir düzine 1-2kb dosyalarını bağlama edildi gerektiren aramalar arasındaki tipik çağrı yığını olabilir. Bu sadece küçük bir util işlevi sarma gerektirir oluşturarak tarafından yapıldı. Dahil fonksiyonları çağrı yığını üzerinde fonksiyonları içinde iç içe olmak. Her Webcoder çağrısı üzerine gerekli değil aynı zamanda php dahili tembel yükleme özellikleri kullanılmış olabilir fonksiyonları 100'ler tam sınıflarının tersine onu düşünün.

İç içe işlevler memoization (önbelleğe alma işlevi sonuçları performansını artırmak için) yararlıdır.

<?php
function foo($arg1, $arg2) {
    $cacheKey = "foo($arg1, $arg2)";
    if (! getCachedValue($cacheKey)) {
        function _foo($arg1, $arg2) {
            // whatever
            return $result;
        }
        $result = _foo($arg1, $arg2);
        setCachedValue($cacheKey, $result);
    }
    return getCachedValue($cacheKey);
}
?>

Bu sadece bir yan etkisi değil, ama structuring kodunuz için gerçekten yararlı bir özellik.

, Uzak ilgisiz kodu (gizli) birbirine yakın, ilgili kodu tutulması ve kapsüllü olursa olsun OO sözdizimi, ya da düz eski usul tarzı kodlama, her zaman iyi bir fikirdir.

Eğer küçük, basit, biraz daha karmaşık fonksiyonu "atmak-away" yardımcı fonksiyonları kullanmak istiyorsanız Örneğin, (ve sadece orada bunları kullanmak istiyorum, örneğin, kod tekrarını önlemek veya berraklığını artırmak ya da daha fazla değişiklik geçirmez yapmak için) Bu, hiçbir geçerli sebep ve yararı için, uzak kendi "ev" fonksiyonu (yani bağlam) dan, genel ad içine bu yerel yardımcıları hareket daha iyi bir kodlama tekniğidir.