Düz bir php fonksiyonu static anahtar sözcüğünü kullanarak herhangi bir sorun var mı?

4 Cevap php

Örneğin:

<?php
    function get_current_user_id(){
        static $id;
        if(!$id){
            $id = 5;
            echo "Id set.";
        }
        return $id;
    }


$id = get_current_user_id();

$id2 = get_current_user_id();

$id3 = get_current_user_id();

echo "IDs: ".$id." ".$id2." ".$id3;
?>

//Output: Id set.IDs: 5 5 5

http://codepad.org/jg2FR5ky

Kullanıcı kimliği almak Böylece muhtemelen tekrarlanan çağrılar sadece hala bellekte bir id basit getirisi yok. Bu php fonksiyonları deyimsel kullanımı olup olmadığını bile bilmiyorum. O değil OO dışında, tür bir singleton gibi, ve bunu kullanarak diğer insanları duymuş ya görmedim, bu nedenle orada bu şekilde statik kullanılarak downsides, ya FRİKİKLERİNDEN varsa ben farkında olmalı, eğer ben merak ediyorum fonksiyonlarda Statiğin daha karmaşık kullanım durumları için.

Peki, sorun ben Statiğin kullanımının bu tür karşılaşabilirsiniz?

4 Cevap

Ben bu yaklaşım yanlış bir şey olduğunu sanmıyorum - Aslında, ben bir sürü denir bir işleve sahip olduğunda büyük / yararlı olduğu, bir "very short-lifetime caching mecanism" gibi, oldukça sık kendim kullanmak kez, ve ağır hesaplamalar (like a database query) Her zaman bir komut belirli bir yürütülmesi için aynı değeri döndürmek için gelmez.

Ve ben bunu yaparken bir tek ben değilim biliyorum: Drupal, örneğin, bu mecanism bir çok kullanır - bir önbellek olarak, çok.

Eğer işlevine bir additionnal parametre geçirmek için var;: görüyorum tek "sorun" sen "önbelleğini temizleyin" istediğiniz zaman olduğunu ve parametre ayarlandığında statik önbellek "reset" için kod birkaç satır.

Static bu bağlamda ince ve hatta (hala artık bir rol oynar, ama gerektiği değil) PHP 4 çalışır.

Bu yaklaşım ile açıkça yanlış bir şey olduğunu sanmıyorum. Ben önbelleğini uygulayan çoğu insan muhtemelen basit bir statik değişken daha bunu yapmak için daha karmaşık bir kurulum kullanıyor bu sadece düşünüyorum. Eğer çalışırsa, o var, bu yüzden kullanabilirsiniz.

Ben bir sayı dizisi hesaplayan bir fonksiyon önbelleğe alma uygulamak için daha iyi bir yol düşünemiyorum. Örneğin, Fibonacci dizisi sayıları hesaplama söylüyorlar. Önbelleğe kullanmadan her ardışık arama, program zaten görmüş bir yeni liste ve yeniden hesaplamak sayılar üretmek istiyorum. Eğer olurdu beri statik değişkeni kullanarak, sadece, n önbelleğe toplama önbellek uzunluğundan daha küçük olduğunu ve fib(n) yüksek sayılar n bilgisayara trivially basit olurdu unsurunu geri dönebilir önbelleğinizde sonunda son iki elemanları ile başlamak mümkün. Bir tek olarak bu uygulama abartılı olur.

Ben static anahtar kelime bu bağlamda geçerli hayır çok eminim. (Althought ben tamamen yanlış olabilir) Geleneksel olarak, böyle değerler ya işlevi içine referans olarak geçirilen ya da genel kapsamda bir değişken erişmek için global anahtar kullanmak istiyorsunuz.