Ne zaman bağlama geç statik kullanmak gerekir?

6 Cevap php

Bağlayıcı this description Geç statik ve okuduktan sonra (LSB) Ben neler oluyor oldukça net bir şekilde görüyoruz. Şimdi, şartlar hangi türlü altında olduğu en yararlı ya da gerekli olabilir?

6 Cevap

Ben aşağıdaki senaryoda için LSB bu gerekli:

  • Eğer bir e-posta sunucusundan mesajı indirir sınıflandırır, ayrıştırır, onu kaydeder ve daha sonra mesajın türüne bağlı olarak, bir şeyler yapan bir "posta işlemci" cini yapıyolar düşünün.
  • Sınıf hiyerarşisi: Eğer çocuklar "BouncedMessage" ve "AcceptedMessage" ile, bir baz Mesaj sınıf var.
  • Mesaj türlerinin her diskte kendisini inat kendi yolu vardır. Örneğin, BouncedMessage tüm mesajları BouncedMessage-id.xml olarak kendini kurtarmak için deneyin. AcceptedMessage-timestamp.xml gibi - AcceptedMessage, diğer taraftan, farklı kendini kaydetmek gerekir. Burada önemli olan dosya adı deseni belirlemek için mantık farklı alt sınıflar için farklı, ama shared alt sınıfı içindeki tüm öğelerin olmasıdır. Bu statik bir yöntem olması için mantıklı nedeni budur.
  • Taban Mesaj sınıfı soyut bir statik yöntem (evet, soyut AND statik) "kurtarmak" vardır. BouncedMessage somut bir statik yöntemi ile bu yöntemi uygular. Sonra, aslında mesajı alır sınıf içinde, arayabileceğiniz ":: save ()"

Eğer konu hakkında daha fazla bilgi edinmek istiyorsanız:

Geç statik bağlama için ben bir birincil ihtiyaç statik örnek oluşturma yöntemleri kümesi içindir.

Bu DateAndTime class I Smalltalk / Squeak gelen PHP taşıdık bir kronoloji kitaplığının parçasıdır. Kütüphanenin tüketici tam olarak geçerli olmayan bir örneğini elde etmek mümkün olduğunu böylece statik yöntemi parametre denetimi tutarken statik örnek oluşturma yöntemleri kullanarak, argüman türleri çeşitli örneklerinin oluşturulmasını sağlar.

Bu statik örnek yaratma yöntemleri uygulamaları başlangıçta çağrısı ile hedeflenen ne sınıf belirlemek, böylece geç statik bağlama bu durumda yararlıdır. Burada kullanım örneğidir:

With LSB:

class DateAndTime {

    public static function now() {
        $class = static::myClass();
        $obj = new $class;
        $obj->setSeconds(time());
        return $obj;
    }

    public static function yesterday() {
        $class = static::myClass();
        $obj = new $class;
        $obj->setSeconds(time() - 86400);
        return $obj;
    }

    protected static function myClass () {
        return 'DateAndTime';
    }
}

class Timestamp extends DateAndTime {

    protected static function myClass () {
        return 'Timestamp';
    }
}


// Usage:
$date = DateAndTime::now();
$timestamp = Timestamp::now();

$date2 = DateAndTime::yesterday();
$timestamp2 = Timestamp::yesterday();

Geç statik bağlayıcı olmadan, [Geçerli benim uygulamasında olduğu gibi] her sınıf bu örnekte olduğu gibi her örneği oluşturma yöntemi uygulamak gerekir:

Without LSB:

class DateAndTime {

    public static function now($class = 'DateAndTime') {
        $obj = new $class;
        $obj->setSeconds(time());
        return $obj;
    }

    public static function yesterday($class = 'DateAndTime') {
        $obj = new $class;
        $obj->setSeconds(time() - 86400);
        return $obj;
    }

}

class Timestamp extends DateAndTime {

    public static function now($class = 'Timestamp') {
        return self::now($class);
    }

     public static function yesterday($class = 'Timestamp') {
        return self::yesterday($class);
    }

}

Örnek oluşturma yöntemleri ve sınıf hiyerarşisinin sayısı arttıkça yöntemlerin çoğaltılması popo gerçek bir ağrı olur. LSB Bu tekrarını azaltır ve daha temiz ve daha düz ileri uygulamaları için izin verir.

Bu yararlı zaman:

  1. Sen sınıf hiyerarşisi içinde değişir özelliğe sahip,

  2. Işlevselliği hiyerarşinin üzerinde aynı imzası vardır, ve

  3. (Önemlisi) Sen kapalı işlevselliğini asmak için bir örneği yok.

Sadece 1. ve 2. elde ise, sıradan bir örnek yöntemini kullanırsınız. Yani Alex'in problemi (bu soruya verdiği cevaba bakınız) LSB gerektirmez.

Tipik bir durumda alt sınıfları farklı şekillerde kendilerini oluşturmak nesne oluşturma,, ama aynı parametreler kullanılarak. Açıkçası aramak için hiçbir örneği var, bu yüzden (aynı zamanda bir fabrika yöntemi olarak bilinen) oluşturma yöntemi statik olmalıdır. Yine onun davranış alt sınıfına bağlı olarak değişir istiyorum, bu yüzden sıradan bir statik yöntem doğru değil. Bir örneğin Adam Franco'nun cevaba bakınız.

Eğer bir sınıfta aşırı henüz bir yöntem içinde bir aşırı statik özelliği / Yöntem erişmek gerekir - Eğer geç statik bağlama gerekir. Hızlı bir örnek: paste2.org

class User extends ActiveRecord ve User::find(1) çağrılan yöntemi çağırmak için deneyin: Eğer böyle olmazdı PHP benzer bir şey, uygulamaya çalışırsanız klasik bir örnek, Ruby adlı ActiveRecord sınıf aslında ActiveRecord::find() Eğer find() in User aşırı değil, çünkü - {[(6 in find() bağlama yöntemi ancak geç statik olmadan )]} bunun içinde (self çağrıldığında var her zaman ActiveRecord) işaret edecek sınıflandırılır ve böylece sizin için kullanıcı nesneyi almak olamaz bilmenin bir yolu vardır .

Suppose you have classes representing tables (row instances) in a simplified object-relational mapper. You would have a class "User" and a class "Company" who's instances are representing rows of the respective tables. User and Company would inherit from some base abstract class, let's say "BaseObject" that will have some common methods like save(), delete(), validate() etc ...

Eğer doğrulama ve tablo tanımı ilgili verileri saklamak istiyorsanız, iyi yer türetilmiş her sınıfta bir statik değişken olacağını - doğrulama ve tablo tanım Kullanıcı her örneği için aynı olduğundan.

Olmadan LSB BaseObject de sözü doğrulamak () yöntemi Kullanıcı bir örneği üzerinden çağıran olsa bile, kullanıcı ve şirket tanımlanan statik değişkenler hiçbir başvuru olurdu. Bu BaseObject sınıfında aynı statik değişken için bakacağız ve bir hata yükseltmek olacaktır.

Bu PHP 5.2.8 ile benim deneyim - LSB 5.3 tanıtıldı olacak

Bazı biçimlendirme kolları statik yöntemi ile bir sınıf var. Başka bir sınıf var ki ihtiyaçlardan daha bu biçimlendirme nasıl işleyeceğini dışında özgün bir bütün işlevselliği.