Istenmeyen örnekleme PHP sınıfları korumak?

3 Cevap php

Sanırım şifreli kod ile müşterilerimize temin edilecek olan bir PHP kitaplığı üzerinde çalışıyorum. Kod onlar lisans doğrulama işlemek ve bunların kullanımı için yöntemler gösterecektir örneğini ana sınıfları yer alacak. Ana sınıfı, kendi dosyasında bulunan birçok alt sınıflar her örneğini. Nasıl müşterilerimize alt sınıf dosyaları da dahil olmak üzere ve kullanımı için alt sınıflar kendilerini nesnelleştirilmesinin önleyebilir? Bizim ana sınıfı hariç örneğinin bir alt sınıfını önlemek için bir yolu var mı?

3 Cevap

Tahmindi, ama tüm alt sınıflar için (ana sınıfı) bağımlılık enjeksiyonu ile bir ana sınıfı için Singleton, ve fabrika / Singleton kullanın. Bu şekilde alt sınıfları bile birincil sınıfının bir örneği için geçerli bir referans olmadan yük olmaz.

EDIT: Bu yanıt kabul edildi beri ben gelecek okuyucuların yararına, bir örnek vermeye karar verdik. Ayrıca, nihai olarak tüm sınıfların işaretlemek unutmayın.

İlköğretim Sınıf:

final class myPrimaryClass {

	private static $instance = null;

	private function __construct() {
		// do something or not
		return $this;
	}

	public static function getInstance() {
		if (is_null(self::$instance) || !(self::$instance instanceof myPrimaryClass))
			self::$instance = new myPrimaryClass;
		return self::$instance;
	}
}

Singleton Alt sınıf:

final class mySingletonSubClass {

	private static $instance = null;

	private function __construct(myPrimaryClass $primaryClassInstanceRef) {
		return $this;
	}

	public static function getInstance(myPrimaryClass $primaryClassInstanceRef) {
		if (is_null(self::$instance) || !(self::$instance instanceof mySingletonSubClass))
			self::$instance = new mySingletonSubClass($primaryClassInstanceRef);
		return self::$instance;
	}
}

Fabrika Alt sınıf:

final class myFactorySubClass {

	private function __construct(myPrimaryClass $primaryClassInstanceRef) {
		return $this;
	}

	public static function getNewInstance(myPrimaryClass $primaryClassInstanceRef) {
		return new myFactorySubClass($primaryClassInstanceRef);
	}
}

Bu örnekte ilgili iki not; İlk, tabii ben fena halde konuyu basitleştirerek. İkinci olarak, istihdam verebilecek bir düzgün hile getInstance() yöntemleri her zaman sonra ilk kez bir argüman olarak iletilen birincil sınıfın bir örneği olması gerekmez böylece hafifçe alt sınıfları değiştirmek için. Ben singleton sınıfı ile burada bir örnek vereceğiz:

final class mySingletonSubClass {

    private static $instance = null;
    private static $classInstanceRef = null;

    private function __construct(myPrimaryClass $primaryClassInstanceRef) {
        return $this;
    }

    public static function getInstance(myPrimaryClass $primaryClassInstanceRef = null) {
        if (!is_null($primaryClassInstanceRef))
			self::$classInstanceRef = $primaryClassInstanceRef;

        if (is_null(self::$instance) || !(self::$instance instanceof mySingletonSubClass))
            self::$instance = new mySingletonSubClass(self::$classInstanceRef);

        return self::$instance;
    }
}

Bu PHP's type-hinting mechanism dayanır, lütfen unutmayın. Bunun gibi, read the manual entry on it yani nüansları (örneğin varsayılan null) anlamak gerekir.

I don't think there's a language-supported way, so it'll be down to tricks. What you could do is add a secret argument to your private class's constructors, which is only known by your main class. If that's not present, throw a NotAllowed exception.

Ben (evet kimse güvenlik-through-belirsizliği sever) çirkin ve çok güvenli değil biliyorum, ama bu özel durum için yeterince işe yarayabilecek ...

Ben bu konu artık biraz eski olduğunu biliyorum, ama ben sadece ne kadar Java bu yapardım Arayan Stack Inspecion olduğunu düşünüyordum, ve PHP benzer bir şey yok? Bir PECL modül olsa aslında, yapar:

http://www.php.net/manual/en/function.apd-callstack.php

, Çağrı yığını alın kod noktaları karşı kontrol, bu maç değil, bir özel durum. Hatta sizin için bu kontroller yapar, ortak bir üst sınıfı oluşturabilirsiniz.