2009-09-10 20 views
6

Từ php.net:Bạn có sử dụng tính năng tự động tải trong PHP không?

Trong PHP 5, điều này không còn cần thiết nữa. Bạn có thể xác định một hàm __autoload() được tự động gọi trong trường hợp bạn đang cố gắng sử dụng một lớp/giao diện chưa được xác định. Bằng cách gọi hàm này, công cụ tạo kịch bản được cung cấp một cơ hội cuối cùng để nạp lớp trước khi PHP không thành công với một lỗi.

Bây giờ tôi muốn biết, thực tiễn không tốt là chỉ sử dụng __autoload để tải các lớp thích hợp trên trang web động?

Cách trang web của tôi được thiết lập là để bao gồm các file vào file index.php, ví dụ http://www.site.com/index.php?p=PAGE-I-WANT-TO-LOAD

Vì vậy, nếu tôi về phần diễn đàn hoặc phần blog của trang web của tôi, tôi muốn các lớp học chỉ thích hợp và chức năng được tải, vì vậy tôi sử dụng tự động tải nhưng tôi không bao giờ bao gồm một tệp theo cách thủ công, tôi có nên sử dụng __autoload làm phương sách cuối cùng hay là những gì tôi đang làm tốt ngay cả trên một hệ thống lưu lượng truy cập cao?

Trả lời

8

Xấu? Số __autoload() là một trong những bổ sung yêu thích của tôi cho PHP 5. Nó loại bỏ trách nhiệm (và phiền toái) bằng tay phải bao gồm/yêu cầu các tệp lớp cần thiết cho ứng dụng của bạn. Điều đó đang được nói, đó là vào bạn như là nhà phát triển để đảm bảo rằng chỉ có 'các lớp thích hợp' được nạp. Điều này có thể dễ dàng thực hiện với lược đồ đặt tên có cấu trúc và cấu trúc thư mục. Có rất nhiều ví dụ trực tuyến về cách sử dụng đúng __autoload(), thực hiện tìm kiếm trên Google và bạn sẽ tìm thấy nhiều thông tin.

+1

Vâng tôi đã sử dụng nó rồi, tôi đã hỏi liệu đó có phải là hiệu suất dựa trên nó không? – JasonDavis

+2

@ jason: Bạn có thể làm rõ điều đó trong câu hỏi của bạn, bởi vì bạn không đề cập gì về hiệu suất ngay bây giờ. –

+0

@musicfreak bạn là đúng nhưng cũng nếu nó không tốt cho hiệu suất sau đó nó rất có thể sẽ được coi là "thực hành xấu" – JasonDavis

8

Tự động tải là một cách hay để chỉ tải những lớp học cần thiết.

Trong PHP 5> = 5.1.2, hầu hết các vấn đề với __autoload cũ() biến mất, nhờ spl_autoload_register().

+1

Tôi chỉ xem trang tham chiếu spl_autoload_register(), tôi thực sự không hiểu nó, là nó cần thiết hay chỉ sử dụng chức năng __autoload cơ bản ok? – JasonDavis

+1

Nếu bạn muốn có nhiều hơn một bộ nạp tự động, bạn phải sử dụng spl_autoload_register, nếu không, __autoload sẽ hoạt động tốt. –

+0

Điểm bán hàng chính của spl_autoload_register() là một thư viện lớp có thể định nghĩa chức năng tự động tải riêng của nó, mà không gặp lỗi thời gian chạy vì __autoload() được định nghĩa hai lần. – gnud

3

Mối nguy hiểm duy nhất đối với __autoload() là nếu bạn xác định chức năng tự động tải kém. Nói chung, tất cả các bạn sẽ nhận được trong điều khoản của một hit hiệu suất là một vài đĩa tìm kiếm như PHP tìm kiếm các tập tin bên phải có chứa các lớp học của bạn. Nhược điểm là loại bỏ tất cả các cuộc gọi gây phiền nhiễu include().

Nếu bạn lo lắng về hiệu suất ở cấp độ này, thì bạn đã sử dụng bộ nhớ cache opcode như APC.

+0

Có tôi sử dụng APC, tôi không thực sự lo lắng tôi chỉ không muốn tiếp tục sử dụng tự động tải nếu nó là xấu để mong đợi nó để tải các tập tin hoặc sử dụng nó như một bản sao lưu, như nếu bạn quên t laod một tập tin, cảm ơn cho thông tin – JasonDavis

4

Bây giờ tôi muốn biết, thực tiễn không tốt là chỉ sử dụng __autoload để tải các lớp thích hợp trên trang web động?

Không hề. Bạn có thể dựa vào tự động tải, tất cả những gì bạn cần làm là đưa ra một quy ước đặt tên tốt và triển khai trình nạp tự động hiệu quả.

Có một vấn đề chính cần xem xét. Tự động tải và Zend Guard không chơi tốt với nhau, bởi vì Zend Guard có xu hướng đổi tên mọi thứ, điều đó có nghĩa là quy ước đặt tên bạn quyết định sử dụng sẽ rất có thể không giống nhau. Nếu bạn sẽ sử dụng Zend Guard (hoặc bất kỳ obfuscator khác cho rằng vấn đề), bạn rất có thể sẽ bị buộc phải bao gồm tất cả các tập tin bằng tay.

Dưới đây là một trích dẫn từ hướng dẫn sử dụng Zend Guard:

lớp tự động load sẽ không làm việc kể từ khi tên tập tin trên đĩa sẽ không phù hợp với tên lớp obfuscated.

+0

Tôi hiện đang sử dụng tính năng tự động tải, nhưng đây là một điểm tốt về việc nó không hoạt động với Zend Guard mà tôi không sử dụng nhưng vẫn biết điều tốt về +1 – JasonDavis

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