2013-05-06 22 views
8

Thứ nhất, đây là một chút dài, vì vậy cảm ơn bạn đã đọc.PHP 5.4 vs 5.3: Tự động tải nhiều lớp trong cùng một tệp

Vấn đề của tôi cũng tương tự như thế này: Class not found in the same file

Tôi có một khuôn khổ custom-built ban đầu được viết vào năm 2008 cho PHP 5 và nó được nâng cấp trong những năm qua để làm việc với PHP 5.3. Tôi đã xem xét khả năng tương thích 5.4 và đã gặp phải một vấn đề nghiêm trọng.

Lớp ORM tự động tạo các lớp cho mỗi bảng DB. Tất cả các lớp này đều nằm trong một tệp trên mỗi bảng và trình tải tự động của chúng tôi tải tệp đó khi được yêu cầu. Ví dụ: bảng 'khách hàng' trong lược đồ 'công khai' (postgresql) sẽ có các lớp sau: PublicCustomer, PublicCustomerDBReader, PublicCustomerDBWriter. Hiện tại, đây có thể không phải là thiết lập lý tưởng, nhưng đó là những gì chúng tôi hiện có.

Trong PHP 5.3, nếu PublicCustomer được yêu cầu, tệp sẽ được đưa vào, phân tích cú pháp và tất cả các lớp ở trên sẽ có sẵn. Vì vậy, nếu, ví dụ, một phương thức tĩnh được gọi trên PublicCustomer, và phương thức đó gọi một cái gì đó trong PublicCustomerDBReader, điều đó sẽ làm việc tốt, vì lớp đó nằm trong cùng một tệp.

Trong PHP 5.4, có vẻ như một số tối ưu đã được thực hiện trong lõi. Trong trường hợp trên:

  1. Phương thức tĩnh được gọi trong PublicCustomer.

  2. Trình tải tự động tìm và tải tệp chính xác.

  3. Trình phân tích cú pháp PHP chỉ phân tích cú pháp đến vị trí cần; lớp PublicCustomer. Nó chưa phân tích cú pháp hoặc khởi tạo lớp PublicCustomerDBReader. Tôi có thể xác nhận điều này bằng cách kiểm tra xem lớp có tồn tại không và bằng cách xem liệu trình phân tích cú pháp có đến cuối tệp khi nó được đưa vào hay không, khi phương thức được gọi (nó không).

  4. Phương thức trong PublicCustomer sau đó cố gọi một phương thức trong PublicCustomerDBReader. Điều này không thành công, vì trình nạp tự động của chúng tôi đã yêu cầu tệp một lần.

Dường như với tôi rằng tôi có hai giải pháp:

  1. riêng các lớp này ra để có một hồ sơ cho mỗi (điều này sẽ tạo ra một số lượng lớn các tập tin)
  2. Thiết kế lại các ORM lớp sao cho không yêu cầu nhiều lớp.

Tôi đã hiểu vấn đề ở trên đúng chưa?

Có ai biết nếu một tối ưu hóa hoặc thay đổi được thực hiện trong PHP 5.4 có thể gây ra hành vi này không?

Có bất kỳ giải pháp tiềm năng nào khác cho vấn đề mà tôi chưa xem xét không?

+2

Bạn nên sử dụng phương pháp 1. Bạn có bao nhiêu lớp học? nó không phải là rất nhiều công việc. Các trình nạp tự động PHP dựa trên tên tệp \ Thư mục liên quan đến tên lớp \ namespace. Không có hỗ trợ gói dựng sẵn trong PHP. Dù sao nó sẽ làm cho kịch bản của bạn thêm mô-đun. Tại sao ứng dụng sẽ phải phân tích cú pháp class1 và class2 khi chỉ yêu cầu class2? – mpm

+0

Có điều gì ngăn cản bạn sửa đổi ORM theo cách tạo các tệp riêng biệt cho mọi lớp không? Điều này sẽ dễ dàng giải quyết vấn đề và sẽ tốt hơn. ;) –

+0

Tôi có thể tách các lớp thành các tệp riêng biệt, nhưng điều đó rõ ràng sẽ nhân số lượng tệp trong ORM. Thực tế có 5 lớp cho mỗi bảng DB, vì vậy điều này sẽ tăng số lượng tệp năm lần. Một số cơ sở dữ liệu tôi quản lý có 300-400 bảng, có nghĩa là ~ 2000 tệp. Rõ ràng nó không phải là một thiết kế tuyệt vời, tôi chỉ tự hỏi làm thế nào tốt nhất để thay đổi nó di chuyển về phía trước. – user2353938

Trả lời

1

Đặt các lớp người đọc/người viết ở phần đầu của tệp. Ngoài ra, bạn có thể xem xét việc gửi báo cáo lỗi, vì trình phân tích cú pháp chỉ nên tạm dừng các lỗi.

0

Tham chiếu đến PHP Framework Interop Group và tiêu chuẩn tự động tải của chúng PSR-0PSR-4 mỗi lớp phải có tệp riêng với tên kết thúc bằng .php. Ngay cả khi bạn có hàng ngàn lớp học, điều này không phải là vấn đề đối với hệ thống tệp.

Với hơn một lớp trong một tập tin bạn phải xem xét các khía cạnh sau:

  • Đối với mỗi lớp autoloader phải quyết định tập tin để tải. Nếu bạn có nhiều lớp trong một tệp, mỗi lớp được sử dụng sẽ gây ra một tải. Các tệp lớp nên được tải một lần và không nhiều hơn, vì các lớp không thể được redeclared. Tôi không khuyên bạn nên nó, nhưng bạn có thể xử lý này với autoloader của riêng bạn, mà ghi nhớ các tập tin nạp hoặc thử nghiệm cho các lớp học nạp.
  • Các lớp được đặt trong cùng một tệp và sử dụng lẫn nhau là vấn đề. Sự cố được mô tả trong Derived class defined later in the same file “does not exist”?answered by Jon.
Các vấn đề liên quan