PHP 'örneği "sınıf sabiti ile başarısız

0 Cevap php

Ben güçlü I geldiğince yazmaya çalışıyorum bir çerçeve üzerinde çalışıyorum. (PHP içinde çalışma ve C # Sevdiğim bazı fikirleri alarak ve bu çerçevede onları kullanmak çalışıyorum.) I domain kişiler / nesneler topluluğudur bir Collection sınıfı oluşturma. Bu tür. Net List<T> nesne sonra modellendi.

Ben bu sınıfı yazarak beni engelleyen bir engel haline çalıştırmak. Ben bir UserCollection varsa, sadece Kullanıcı içine nesneleri izin vermelidir. Ben bir PostCollection varsa, sadece Mesaj nesneleri izin vermelidir.

Bu çerçevede tüm koleksiyonlar, gibi eklemek bazı temel işlevleri vardır kaldırmak, yinelemek gerekiyor. Ben bir arayüz oluşturduk, ama ben şu yapamazdım bulundu:

interface ICollection { public function add($obj) }
class PostCollection implements ICollection { public function add(Post $obj) {} }

Bu arayüz ile uyum bulunuyor kırdı. Sonra tüm Koleksiyonlar aynı tipte çünkü Ama ben arayüz kesinlikle yazılı olamaz. Yani şu çalıştı:

interface ICollection { public function add($obj) }
abstract class Collection implements ICollection { const type = 'null'; }
class PostCollection extends Collection {
 const type = 'Post';
 public function add($obj) {
  if(!($obj instanceof self::type)) {
   throw new UhOhException();
  }
 }
}

Ben bu kodu çalıştırmayı denediğinizde, ben syntax error, unexpected T_STRING, expecting T_VARIABLE or '$' instanceof deyimi olsun. Biraz sorunu içine araştırma ve neden köküne benziyor $obj instanceof self sınıfına karşı test geçerli olmasıdır. PHP ifadesinde tüm self::type sabit bildirimde işlemez görünür. self::type Bir değişkeni ekleme parantez '(' beklenmeyen ilgili bir hata attı.

Bariz bir geçici çözüm type değişkeni bir sabit yapmak değil etmektir. ($type tabii bir değişken olarak bildirilirse) ifadesi $obj instanceof $this->type gayet güzel çalışıyor.

Ben daha sonra değişken olası değişikliğini önlemek için sürekli olarak değerini tanımlamak istiyorum gibi, bu önlemek için bir yol var olduğunu umuyorum. Ben bunu başarmak konusunda herhangi bir düşünce ya da ben bu konuda o limitine PHP almak var? "Kaçan" ya da işlerken PHP ölmeyecek self::this, böylece sarmalamanın bir yolu var mı?

Işlerin altında kod - UPDATE aşağıda geri bildirimlere dayanarak, ben denemek için bir şey düşündüm! Herkes) 1 bunu yapmak için bir neden düşünebiliyor musunuz, 2) bir nedeni de, bu sonuçta işe yaramaz, ya da 3) daha iyi bir yolu bu koparmak?

interface ICollection { public function add($obj) }
abstract class Collection { const type = null; protected $type = self::type; }
class PostCollection extends Collection {
 const type = 'Post';
 public function add($obj) {
  if(!($obj instanceof $this->type)) {
   throw new UhOhException();
  }
 }
}

UPDATE #2: üretime yukarıdaki kodu koyarak sonra, o çalışmıyor çıkıyor. Ben bunu test zaman amele nasıl hiçbir fikrim yok, ama hiç çalışmıyor. Ben bir protected değişkeni kullanarak şaşırıp, sanırım.

0 Cevap