PHP çalışma zamanı sınıf modifikasyon

2 Cevap php

Yani zamanında sınıf yöntemleri çıkarmak / eklemek mümkün olmak istiyorum. O OOP'deki korkunç pratice söyle önce, bu olabilir, ama gerçekten umurumda değil. Ben uygulama çok modüler olmak istiyorum, çünkü bunu yapmak mümkün olmak istiyorum nedeni, bu nedenle bazı eklenti ana app öldürmeden bazı temel sınıf genişletmek ve buna yöntemler ekleyebilirsiniz.

Örneğin, ben şu sınıfı söylüyorlar:

class User {
    protected $Id;
    protected $Name;
    protected $Password;
    protected $PostsPerPage;
 }

Ve bazı eklenti sınıfa $ Visible özelliğini ekleyerek, kullanıcılar kendi görünürlük ayarlarını değiştirmek için imkanı ekler, söylüyorlar. Sınıf olacak:

class User {
    protected $Id;
    protected $Name;
    protected $Password;
    protected $PostsPerPage;
    protected $Visible;
 }

Bu __ get ve __ set ile elde edilebilir, ancak en yaygın uygulama alma ve zamanı oluşturulan özelliklerini ayarlamak için, ve bir eklenen her özellik için sözde alıcı ve ayarlayıcıları kod güçlük yanı sıra, __ set kullanarak olurdu bir hayır- hayır bence.

Ben diğer fikri $ UserVisiblitySettings [userid] gibi başka bir dizide, ayrı ayrı kullanıcı ayarlarını saklamak için, ama bunları olmak istiyorum kadar ki OO gibi şeyler değil yapar.

Sonraki fikir bir yardımcı sınıf, böyle bir şey yapmak oldu:

class UserHelper {
    public function SetVisiblity($user_object,value);
}

Sonra, ben kullanabilir __ get ve __ "arkadaş" yöntemleri / sınıfları uygulamak için ayarlanır, ancak bu çok hackish geliyor. Ben bu şekilde gitmek için sanki de sadece aşırı __ get ve __ set __, diyebilirsiniz. Ayrıca ben bu iyi cepten pratice bu yüzden emin değilim, ve çok çirkin bakmak istiyorum.

Ben son fikir (bu ben de ile gelebilir eval tek geçerli kullanımı)) eval (kullanarak runtime dinamik sınıflar oluşturmak için bazı işleve sahip oldu. Temelde, sınıf 'açılış ve kapanış parantez bulmak ve eval göndermek için bazı basit dirsek bulgu yapmak, bir dosyadan sınıf tanımını olsun.

Bu modası geçmiş ve ben oldukça bazı uzantısı yüklemek için kullanıcı zorlamak istemem gibi runkit kullanarak, söz konusu değildir.

Ben fikirlere baktığınızda, yoğun basit bir ve daha az cpu _call aşırı ve yöntemler sınıfında kayıtlı olması için bir yol eklemek gibi görünüyor.

Olmayan herhangi bir düşünce takdir edilmektedir "bunu yapmayın" Lütfen.

2 Cevap

RunKit uzatma yapabilirsiniz (runkit_method_add(), vb)

Ancak deneysel bir uzantısı ve zaten ayak yönelik konum ...

Diğer seçenekler:

  • __get() ve __call() ile yeni alanlar ve yöntemler taklit
  • Use subclassing and Factory pattern (class Plugin extends BaseImplementation and have factory instantiate Plugin instead of BaseImplementation). Zend Plugin Loader does something like this.
    It's the solution with least overhead, but also is limited to one plugin extending one class.
  • Kanca ekleme ve heyet (Strateji desen) ($this->plugin->onFoo()) kullanabilirsiniz. There's library for this.

PHP buna izin vermez. Diğer açılardan dinamik bir dil olabilir, ancak sınıf sistemi kasten kısıtlayıcı olduğunu. Ya zamanında sınıfları ile ilgili alaycı (Ama o zaman artık düz PHP kullanarak değil) izin dilini değiştirir runkit uzantısı, yükleme veya kullanabilirsiniz {[(1)] } simüle etmek.