Dinamik alt sınıf oluşturma

3 Cevap php

Ben Kohana kullanarak ve sadece kendi autoloading yönteminde bu kod parçası bulundu am

		// Class extension to be evaluated
		$extension = 'class '.$class.' extends '.$class.'_Core { }';

		// Start class analysis
		$core = new ReflectionClass($class.'_Core');

		if ($core->isAbstract())
		{
			// Make the extension abstract
			$extension = 'abstract '.$extension;
		}

		// Transparent class extensions are handled using eval. This is
		// a disgusting hack, but it gets the job done.
		eval($extension);

Ben (class_exists (vb) çağırarak, Nesne örnekleme yoluyla) var olmayan bir sınıf bahsediyorum zaman temelde ne yapar olduğunu, Kohana bazı adlandırma kuralı şöyle bir kütüphane sınıfını genişleten bir sınıfın (örn. Foo) yaratacak (örneğin Foo_Core). Sadece merak olmak, benzer ancak eval kullanımı olmadan bir şey yapmak için herhangi bir yolu var mı?

3 Cevap

Eğer dinamik bir sınıf oluşturmak için arıyorsanız o zaman eval() Goto fonksiyonudur (pun intended.) Ancak biraz ilgili, ben bir {[içinde bir sınıf bildirimi koyabilirsiniz bulduk (2)]} deyimi. Yani aşağıdakileri yapabilirsiniz:

if(true)
{
    class foo
    {
       // methods
    }
}

(Bir yapılandırma dosyasından) dinamik olarak oluşturulan sınıfları mevcut olup olmadığını görmek için kontrol etmek için bu kullanabilirsiniz ... böylece daha sonra, sınıfı yüklemek aksi ... sınıfını yeniden ve yeni bir yük eğer. Eğer benzer nedenlerle dinamik sınıflar oluşturmak için arıyorsanız Yani bu bir çözüm olabilir.

Eğer dinamik olarak oluşturulan sınıfları önbelleğe edebilmek isteyen olsaydı, bir dosyaya yazmak yerine bunu gerektirebilir. Bu eşit kesmek-imsi düşünülebilir, ama bu bir seçenektir. Bir kez oluşturulur ve sık kullanılan sınıflar için iyi bir çözüm olabilir. Eval ile yapıştırma, her zaman dinamik olması gereken sınıflar için muhtemelen en iyi çözümdür.

$proxyClassOnDisk = '/path/to/proxyCodeCache/' . $clazz .'.cachedProxyClass';
if ( ! file_exists($proxyClassOnDisk) ) {
    // Generate the proxy and put it into the proxy class on disk.
    file_put_contents($proxyClassOnDisk, $this->generateProxy($object));
}
require_once($proxyClassOnDisk);

Bu örnekte, fikir $object sınıfı için dinamik vekiller yaratıyor olmasıdır. $this->generateProxy($object) daha fazla veya daha az $extension orijinal soruya benziyor ne gibi görünüyor dize dönecektir.

Bu hiçbir şekilde tam bir uygulama, ben tarif ediyorum ne göstermek için sadece bazı sözde kodudur.