2010-03-11 23 views
6

Giả sử bạn đang xây dựng một ứng dụng web sẽ là sản phẩm đóng gói một ngày, một sản phẩm mà người dùng sẽ muốn có thể mở rộng và tùy chỉnh.Có tùy chọn các lớp tùy chỉnh nhưng tên lớp hợp nhất

Nó đi kèm với một thư viện lõi bao gồm các file PHP có chứa các lớp:

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

Bây giờ, giả sử bạn muốn giữ một sạch lõi mà người dùng không thể vá. Tuy nhiên, bạn muốn người dùng có thể tùy chỉnh mọi hạt và bu lông nếu cần.

ý tưởng hiện tại của tôi là tạo ra một cơ chế tự động load rằng, khi một lớp được khởi tạo, tải trọng đầu tiên cốt lõi bao gồm:

/library/frontend.class.php 

sau đó, nó chuyển sang thư mục user và trông cho dù có là một bao gồm các cùng tên:

/user/library/frontend.class.php 

nếu có, nó cũng bao gồm điều đó.

Rõ ràng, người dùng bao gồm phải chứa định nghĩa lớp mở rộng định nghĩa trong lõi bao gồm.

Bây giờ câu hỏi của tôi là, làm thế nào tôi có thể khởi tạo một lớp học như vậy? Sau khi tất cả, tôi luôn luôn có thể chắc chắn đó là một định nghĩa về:

class frontend_core 

nhưng tôi không thể chắc chắn có một

class frontend_user extends frontend_core 

Tuy nhiên, tôi muốn để có thể dựa vào, và nhanh chóng, một tên lớp, bất kể có tiện ích mở rộng tùy chỉnh cho lớp hay không.

Có cách thông minh, ý tưởng hay mô hình để đạt được điều này không?

Tất nhiên, tôi có thể viết một hàm trợ giúp nhà máy đơn giản để tìm lớp user trước và sau đó cho lớp core và trả về đối tượng được khởi tạo, nhưng tôi thực sự muốn giữ điều này càng đơn giản càng tốt, vì như tôi đã nói, nó sẽ là một sản phẩm đóng gói.

Tôi đang tìm mẹo hoặc mẫu thông minh sử dụng ít mã và giới thiệu ít chức năng mới nhất có thể.

Trả lời

3

Tại sao bạn không làm theo phương pháp này được sử dụng bởi Propel? Bạn tạo các lớp cơ sở của bạn và đã cung cấp một lớp người dùng trống (mở rộng lớp cơ sở), nơi người dùng của bạn có thể đặt chi tiết ghi đè/triển khai cụ thể của họ và trong mã của bạn, bạn luôn tham khảo các lớp Người dùng. Vì vậy, về cơ bản bạn chỉ cần sử dụng nghịch đảo của logic bạn mô tả.

Nếu giải thích ở trên không rõ ràng, hãy xem http://propel.phpdb.org/trac/wiki/Users/Documentation/1.4/QuickStart#a6.UsingtheGeneratedSQLandOMFiles và tạo mã cho một cơ sở dữ liệu nhỏ. Các lớp cơ sở nằm trong thư mục om, các lớp người dùng (theo mặc định trống) nằm trong thư mục gốc.

+0

Tôi muốn giữ thư mục người dùng trống nếu không có tùy chỉnh, nhưng mặt khác, đây là một ý tưởng hay. Nó cung cấp các điểm vào dễ dàng cho người dùng để bắt đầu, thậm chí với các ví dụ mã và giải thích trong các tệp lớp trống. Tôi sẽ suy nghĩ về điều đó. –

+0

Nhưng nó cũng thêm các lớp thừa cần được tải khi người dùng không sử dụng nó, ví dụ: User_Frontend cộng với Core_Frontend thay vì chỉ Core_Frontend khi người dùng chọn để đi với mặc định. – Gordon

0

tôi sẽ thực hiện móc trong lõi, vì vậy người dùng không cần phải hack lõi, nhưng vẫn có thể kéo dài tuổi lõi sử dụng móc

+1

@streetparade Tôi đang sử dụng một hệ thống móc đã ở những nơi khác nhau trong ứng dụng. Việc ghi đè hoặc mở rộng các lớp cốt lõi sẽ vẫn cần thiết cho các tùy chỉnh sâu hơn. Tôi muốn cung cấp cả hai khả năng. –

0

Tôi nghĩ rằng nó phức tạp hơn với một tên tệp duy nhất khi bạn muốn sử dụng thừa kế. Về cơ bản, class user_frontend extends core_frontend phải biết nơi để tìm cả hai lớp. Cả hai đều phải được bao gồm.

Nếu bạn chỉ muốn thực hiện new Frontend, bạn có thể sử dụng PHP2.3 class_alias để trỏ Giao diện người dùng đến lớp chính để sử dụng. Dưới 5.3. bạn có thể sử dụng ServiceFinder, để biết cách ánh xạ Tên dịch vụ cho các Lớp và sau đó nhận Giao diện với $service->get('frontend') hoặc sử dụng Dependency Injection framework.

Chỉnh sửaTôi đã xóa mã Trình tải trước, vì nó đã gặp phải vấn đề này chính xác.

0

Tôi muốn sử dụng hàm tạo của lớp lõi để xác định lớp người dùng cần tải và sau đó triển khai phương thức factory trong lớp lõi để tạo ra các cá thể của lớp người dùng. Bằng cách làm cho hàm tạo của lớp người dùng được bảo vệ và có lớp người dùng mở rộng lớp lõi, bạn có thể chắc chắn rằng mã ở nơi khác không thể khởi tạo lớp người dùng.

C.

0

Bạn có thể có một lớp nạp mà sẽ quyết định lớp để dụ:

Loader::instance()->load('Frontend') 
Các vấn đề liên quan