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?
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?
Ben aşağıdaki senaryoda için LSB bu gerekli:
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:
Sen sınıf hiyerarşisi içinde değişir özelliğe sahip,
Işlevselliği hiyerarşinin üzerinde aynı imzası vardır, ve
(Ö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