PHP nasıl bir üst nesnenin sınıf değişkenleri erişebilirim?

4 Cevap php

A sınıfı bir örneğini diğer nesnelerin bir çift instanciates, sınıf B örneğin söylemek:

$foo = new B();

Ben B. içinden yöntemleri A'nın public class değişkenleri erişmek istiyorum

Ben bir şey eksik sürece, bunu yapmak için tek yolu B örneklerine geçerli nesne geçmektir:

$foo = new B($this);

Bu iyi bir uygulama mı yoksa bunu yapmanın başka bir yolu var mı?

4 Cevap

Bu bana güzel görünüyor, ben başparmak bir kural kullanma eğiliminde "Birisi bu bunu anlamak korumak istiyorsunuz?" ve kolay anlaşılır bir çözümdür.

Yalnızca bir "A" varsa, size, kayıt desenini kullanarak düşünün örneğin bkz http://www.phppatterns.com/docs/design/the_registry olabilir

Eğer yanlış deseni kullanarak değil eğer ben ilk kontrol ederim: uygulama mantığı itibaren, gerçekten A hakkında bilmeniz gereken B? B A hakkında bilmek gerekiyorsa, bir ebeveyn-çocuk ilişkisi oldukça yeterli değil gibi görünüyor. Örneğin, bir çocuk olabilir, ya da A'nın mantığının bir parçasıdır (yani B hakkında bilmiyor) hiyerarşisinde B "altında" olan üçüncü bir nesne içine gidebiliriz.

O dedi, ben bir veri kaynağı olarak bir kayıt ya da bir Observer olarak B kayıt A'da bir yöntem oluşturmak için B bir yöntem ve A B bildirmek için kullandığı B eşleşen bir yöntem var öneririm değer değişiklikleri.

Sadece bir A varsa Paul söylediğine benzer, bir tek olarak bu uygulayabilirsiniz. Daha sonra (aslında yine yığınlaşma), veya yapıcı (kompozisyon) doğrudan bu ilişkiyi ayarlayabilirsiniz bir ayarlayıcı yöntemi ile, yapıcı (toplama) bir argüman olarak A örneğini iletebilirsiniz.

Singletons güçlü iken Ancak, kompozisyon ile onları hayata karşı dikkatli olun. Bu bu şekilde yapabilir ve bir yapıcı argüman kurtulmak olduğunu düşünmek güzel, ama o da imkansız bir kodu yeniden yazıldı olmadan başka bir şey ile bir yerine yapar. Peronsally, ben singleton'ununu kullanarak, toplama ile bile sopa istiyorum

$foo = new B( A::getInstance() );
$foo = new B($this);

Böyle kod maalesef benim ihtiyaçlarını eşleşmiyor. Üst nesne özelliklerine erişmek için başka bir yolu var mı?

Ben neden anlatmaya çalışacağım. Biz bir oyun yazılımı yazmak ve bazı sınıfları çok "sıradışı" bağımlılıkları ve farklı şekillerde birbirlerine etkisi var. Kod bazen her durumda anne bağlantıları olmadan neredeyse desteklenmeyen alır bu yüzden (bazen farklı bağlamlarda bile birçok anne .. Bir Kadro Savaşı ve vb Kullanıcıya ait olabilir yani) bulunuyor.

Ve şimdi bağlantılar beni tatmin etmiyor sebebi. Ben istemci tarafı için bir çıkış oluşturmak zaman, XML nesneleri seri bir tür kullanabilirsiniz. Ebeveynler için bu bağlantıları gibi yinelenen başvurular karşılaşana kadar çok güzel çalışıyor. Onları korumalı yapabilir, ama sonra onların kullanımı ie (kukla örneği) gevşek

$this->squad->battle->getTeam($tid)->getSquad($sqid)->damageCreature(...);

Diğer yol - her serializable sınıfta serileştirme yöntemi uygulamak ve bu gibi serileştiriciye içine aramak için:

$obj->toXML($node);
$this->appendChild($node);

ama yazmak için ve desteklemek için bir sürü şey var! Ve bazen ben dinamik serileştiriciye için (daha az trafik) nesneleri oluşturmak.

Ben bile kesmek hakkında düşünün:) Bazı classess bazı özellikleri göz ardı etmek serileştiriciye "öğretmek" için). Huh ... kötü bir fikir ...

Uzun bir tartışma, ama inan bana, yani Registry ve Gözlemci uymaz. Başka fikirleri vardır?