Ne zaman php statik değişkenler / fonksiyonları kullanabilirim?

5 Cevap php

PHP ile OOP kendimi yeniliyorum ve statik gibi fonksiyonları ve / veya değişkenler ayarı bir örneğini gördük. Ve neden bir değişken / fonksiyon statik ayarlandığında ne zaman? Ben diğer dilleri yaptık ve gerçekten statik kullanarak hiç hatırlamıyorum, ben ona gerçek bir amacı asla bulunamadı. Ben ne yaptığını biliyorum ama neden sadece yerine bir değişken kullanmak değil mi?

5 Cevap

Kullanmak static bir örneğine bağlı olmayan bir yöntem / değişken kullanmak istediğinizde. Yani ne zaman:

  • Amaç ile hiçbir ilişki ve (başka bir şey Java gibi bu OOP, ama PHP kullanışlı değil izin vermez dilde avadanlıklarını için yararlı) bir örneği yok.

  • Sen örneğine erişimi kontrol etmek istiyorum. Çoğu zaman, uğraşmak istediğiniz örneği Eğer kod yazarken tanımlı değil, ancak yürütme olacaktır. Singleton pattern iyi örnektir. Fabrikalar diğer örnekleri ile bağlam ya da paylaşım kaynaklarına göre bir nesne oluşturmak için statik yöntemleri kullanabilirsiniz. EG: Bir statik üye yüzden app parçası yerden aynı bir kere ve o açtı / çatışmalar olmadan kapalı bir veri tabanı katmanına erişim verebilir.

  • Performans madde ve yöntem bir çok kez idam edilecek. Bu durumda, her çağrı bir örneğine üye yukarı bakarak tercümana engelleyen bazı CPU zaman kazandıracak. Perfs bu çözüm gelmek böyle bir sorunları olursa Ama yine de, bu mimari, ya da bir kodun kritik parçalar için daha hızlı bir dil bağlama kullanımını gözden geçirme zamanı olabilir.

  • Eğer bir tür ile ilgili olan bir yöntem olması ama başka uygulanacaktır. Bu birinci tip deklarasyon haline yöntem yazmak mantıklı, ama o başka birinin bir örneğini beklediğini beri statik ayarlayabilirsiniz.

Mükemmel örnek bir dize ayrıştırıcı:

class MyObject 
{
 static function parse($str)
 {
    $obj = new MyObject();
    // some parsing/setting happens here
    return $obj;
 }
}

// you create an object "MyObject" from a string, so it's more obvious
// to read it this way :
$new_obj = MyObject::parse("This a description of a super cool object");

Statik fonksiyonlar ve değişken böyle bir küresel kapsamda Değişkenler / fonksiyonlara erişmek için kullanılır:

echo myClass::myVariable;
echo myClass::myFunction();

Şey statik olduğu zaman, her yerde ulaşılabilir, ve kendini kullanabilir ve sınıfları kapsamında bulunan hariç, bir prosedür tipi işlevine çok benzer.

class myClass{
    static $myVariable = "myVar";
    static function myFunction()
    {
       return "myFunc";
    }
}

Bu kullanmak için yollarından biri tek bir sınıfın örneği veya bir Singleton Yöntemi tutmaktır.

class myClass
   {
    static $class = false;
    static function get_connection()
    {
    	if(self::$class == false)
    	{
    		self::$class = new myClass;
    	}
    	else
    	{
    		return self::$class;
    	}
    }
    private function __construct()
    {
         // my constructor
    }
    // Then create regular class functions.
   }

Bunun özel bir kurucu olduğundan, new operatör ile başlatılamaz olamaz, böylece bir sınıf almak için myClass::get_connection() aramak zorunda kalıyor. (Bu sınıfın bir üyesi olduğu için) Bu işlev, yeni bir sınıf yapabilirsiniz. Sonra bir statik değişkende sınıf saklar ve tekrar işlev çağrısı, sadece oluşturulan sınıfını geri gelecektir.

Sonunda, statik anahtar kelime kapsamında referans, statik, iyi şeyleri tutmak için kullanılır. Bu çünkü mevcut kapsamının 'değişen' bir şey istemiyorum demektir. Singleton yöntem bu biraz uzanıyor olsa da, her zaman 'aynı' sınıf, içeri ne kapsam önemli değil var aynı fikri tutar

PHP Documentation
Static Keyword
Scope Resolution Operator

StackOverflow Knowledge
How to Avoid Using PHP Global Objects
Share Variables Between Functions in PHP Without Using Globals
Making a Global Variable Accessible For Every Function inside a Class
Global or Singleton for Database Connection
PHP Classes: when to use :: vs. -> ?

Bir yöntem çok sık denilen ve örneğin, sadece aynı şeyi yapmak olacak eğer Ayrıca önbelleğe alma için çok yararlıdır:

/**
 * Returns true if the user is logged in through shibboleth
 *
 * @return boolean true on success, else false
 */
protected function is_logged_in() {

    //Check shibboleth headers
    if (!empty($_SERVER['HTTP_SHIB_IDENTITY_PROVIDER']) || !empty($_SERVER['Shib-Identity-Provider'])) {
        if (!empty($_SERVER[$this->core->dbconfig("shib_auth", self::SHIB_AUTH_CONFIG_UID)])) {
            return true;
        }
    }
    return false;
}

Bu yöntem çok sık benim çerçevesinde çağrılır ve orada her zaman yapılandırma $ _SERVER anahtar için bir veritabanı arama aramak için yapacak

Sayfa işlenirken Yani ben o 10 veritabanı aramaları olacak bir sayfa yük 10 kez belki diyorlar ama ben bunu değiştirdim:

/**
 * Returns true if the user is logged in through shibboleth
 *
 * @return boolean true on success, else false
 */
protected function is_logged_in() {
    static $logged_in = null;
    if($logged_in != null) {
        return $logged_in;
    }

    //Check shibboleth headers
    if (!empty($_SERVER['HTTP_SHIB_IDENTITY_PROVIDER']) || !empty($_SERVER['Shib-Identity-Provider'])) {
        if (!empty($_SERVER[$this->core->dbconfig("shib_auth", self::SHIB_AUTH_CONFIG_UID)])) {
            $logged_in = true;
            return true;
        }
    }
    $logged_in = false;
    return false;
}

So it just check for every page load one time the normal behaviour if i logged in and cache the result. next time it will just return the cached value. This feature i use very often to have more performance.

Umarım bu yardımcı olur.

Statik yöntemler kaçının:

blog everyone should follow