2008-10-12 27 views
7

Tôi đang trải qua những gì tôi tin là một vấn đề phụ thuộc vòng tròn với ứng dụng PHP của tôi. Vui lòng cho tôi biết nếu điều này không chính xác. Đây là tình huống:Sự cố phụ thuộc vòng tròn có thể xảy ra với ứng dụng PHP

Hai lớp học, LogManager và DBSession.

DBSession được sử dụng để tương tác với cơ sở dữ liệu và LogManager được sử dụng để đăng nhập vào tệp. Cả hai đều được sử dụng rộng rãi trong ứng dụng của tôi. Khi bạn tạo một thể hiện của DBSession, bạn phải cung cấp cho nó một cá thể của LogManager thông qua một tham số hàm tạo. Điều này bởi vì DBSession đôi khi sẽ ghi thông tin vào một tệp và sẽ sử dụng cá thể LogManager để thực hiện việc này.

Bây giờ, tôi muốn mở rộng LogManager để nó cũng có thể đăng nhập vào một bảng cơ sở dữ liệu, chứ không phải là một tệp văn bản. Đương nhiên, sở thích của tôi là sử dụng lại các lớp hiện có, nhưng tôi sớm nhận ra điều này mang lại một tình huống thú vị.

DBSession đã yêu cầu phiên bản của LogManager để xây dựng. Nếu tôi muốn sử dụng lại lớp DBSession trong LogManager, nó sẽ yêu cầu một thể hiện của DBSession. Làm thế nào tôi có thể đáp ứng cả hai nhu cầu? Rõ ràng, một cái gì đó phải sai với cách tiếp cận của tôi.

Bạn đề nghị tôi sửa lỗi này như thế nào?

Xin cảm ơn trước, các bạn.

Trả lời

8

Không mở rộng LogManager, để cho nó trở thành một loại tổng hợp. Và trì hoãn lựa chọn nơi bạn muốn đăng nhập, tức là:

$logManager = new LogManager(); 
$dbSession = new DbSession($logManager); 
$logManager->add(new FileLog($filename)); 
$logManager->add(new DBLog($dbSession)); 

Trường hợp khóa học FileLog và DBLog có chung một giao diện. Đây là một ứng dụng của mẫu Observer, trong đó add() là hoạt động "subscribe", và FileLog/DBLog là những người quan sát các sự kiện ghi nhật ký. (Bằng cách này bạn cũng có thể lưu nhật ký ở nhiều nơi.)

Owen chỉnh sửa: điều chỉnh thành cú pháp php.

+0

$ logManager = new LogManager(); $ dbSession = DbSession mới ($ logManager); $ logManager-> add (new FileLog ($ filename)); $ logManager-> thêm (DBLog mới ($ dbSession)); – micahwittman

+0

Nó không nhất quán trong các tên lớp .. –

+0

@Owen: cảm ơn bạn đã chỉnh sửa! –

1

Có thể bạn có thể áp dụng một số mẫu, chẳng hạn như Singleton Pattern để đảm bảo rằng bạn chỉ có một ví dụ của lớp LogManager chẳng hạn.

2

Một trong những đối tượng này thực sự không cần đến các đối tượng khác: bạn đoán nó, đó là DBSession. Sửa đổi đối tượng đó để logger có thể được gắn vào nó sau khi xây dựng.

2

Tại sao cần một đối tượng LogManager để tạo đối tượng DbSession, nếu nó đôi khi chỉ ghi vào tệp? lười biếng tải nó thay vì chỉ khi bạn cần nó. Ngoài ra, theo ý kiến ​​của tôi, cả hai nên độc lập với nhau. Mỗi người có thể thể hiện người kia khi cần thiết.

+0

Không bao giờ thực sự cố gắng thực hiện tải chậm, nhưng cảm ơn cho các khuyến nghị. Tôi thừa nhận nó sẽ phù hợp hơn vì LogManager đôi khi chỉ được sử dụng với DBSession. Cảm ơn! –

Các vấn đề liên quan