Özel sınıfların seçeneği ancak birleştirilmiş sınıf adı olması

5 Cevap php

Bir paketlenmiş ürün bir gün, kullanıcıların genişletmek ve özelleştirmek mümkün isteyeceksiniz biri olacak bir web uygulaması inşa varsayalım.

Bu sınıfları içeren PHP dosyalarından oluşan bir çekirdek kütüphane ile birlikte geliyor:

/library/
/library/frontend.class.php
/library/filesystem.class.php
/library/backend.class.php

Şimdi, kullanıcıların yama edemeyeceği bir clean core tutmak istediğinizi varsayalım. Yine de, kullanıcı ihtiyaç olması halinde her somun ve cıvata özelleştirmek mümkün olmak istiyorum.

Benim şu anki fikir sınıf örneği olduğunda, ilk yüklendiğinde çekirdek dahil, bir autoloading mekanizması oluşturmak için:

/library/frontend.class.php

o zaman, user dizinine geçer ve aynı adı dahil olup olmadığını görünüyor:

 /user/library/frontend.class.php

biri varsa, o da içerir.

Tabii ki, kullanıcı dahil çekirdek tanımını uzanan bir sınıf tanımını içermelidir içerir.

Şimdi soru nasıl böyle bir sınıf örneğini olur, nedir? Sonuçta, ben her zaman bir tanımı yoktur emin olabilirsiniz:

class frontend_core

ama orada olduğundan emin olamaz

class frontend_user extends frontend_core

Ancak, sınıf veya özel bir uzantısı olup olmadığını bakılmaksızın, güvenmek mümkün olmak istiyorum, ve örneğini, one class name olur.

Nasıl bunu başarmak için akıllı bir yol, bir fikir ya da desen var mı?

Tabii ki, ben user sınıfının ilk ve daha sonra core sınıf arar ve bir başlatıldı nesneyi döndüren basit bir fabrika yardımcı işlevi yazabilirsiniz, ama ben gerçekten bu tutmak istiyorum Dediğim gibi, bu bir paketlenmiş ürün olacak çünkü, temiz ve mümkün olduğunca basit.

Ben mümkün olduğunca az kod kullanır ve az yeni bir işlevsellik sunar akıllı hile veya desen arıyorum.

5 Cevap

Uskur tarafından kullanılan Neden yaklaşımı takip etmiyor musun? Size temel sınıfları oluşturmak ve zaten kullanıcıların kılmaları / özel uygulama ayrıntıları koyabilirsiniz nereye (temel sınıf uzanan) ve kodunuzda her zaman kullanıcı sınıflara atıfta boş bir kullanıcı sınıfı sağlar. Yani temelde sadece açıklanan mantık tersini kullanın.

Yukarıdaki açıklama, açık değilse, http://propel.phpdb.org/trac/wiki/Users/Documentation/1.4/QuickStart#a6.UsingtheGeneratedSQLandOMFiles kontrol ve küçük bir veritabanı için kod üretmek. Temel sınıflar om klasörde, (varsayılan olarak boş) kullanıcı sınıfları kök klasöründe bulunmaktadır.

Ben çekirdek kanca uygulamak, böylece kullanıcılar çekirdek kesmek zorunda değilsin, ama yine kanca kullanarak çekirdek uzatmak mümkün

Ben yüklemek için kullanıcı sınıfını belirlemek ve daha sonra kullanıcı sınıfın örneğini oluşturmak için çekirdek sınıfın bir fabrika yöntemini uygulamak için çekirdek sınıfın yapıcısı kullanarak giderdim. Korumalı kullanıcı sınıfının yapıcısı yapma ve kullanıcı sınıfı çekirdek sınıfını genişletmek sahip olarak kod başka bir kullanıcı sınıfı örneğini değil emin olabilirsiniz.

C.

Ben de devralma kullanmak istediğiniz zaman tek bir dosya ile daha karmaşık olduğunu düşünüyorum. Temelde class user_frontend extends core_frontend burada hem sınıfları bulmak için bilmek zorunda. Her ikisi de dahil edilmelidir.

Sadece yapmak istiyorsanız new Frontend kullanmak PHP5.3 's class_alias to point Frontend to the main class to use. Below 5.3. you could use a ServiceFinder, that knows how to map Service Names to Classes and then get the Frontend with $service->get('frontend') veya Dependency Injection framework kullanabilirsiniz.

Edit I removed the Loader code given before, because it was suffering from exactly this problem.

Bunu, örneğin hangi sınıfı karar verecek bir yükleyici sınıf olabilir:

Loader::instance()->load('Frontend')