2012-09-13 41 views
12

Tôi chỉ mới bắt đầu nhìn vào Zend Framework 2 (và mới cho ZF nói chung), và trong user guide, họ đang sử dụng tự động tải khi thêm một mô-đun mới. Tuy nhiên, tôi thấy giải thích là khá khó khăn cho một tân binh. Họ đang thêm một tập tin Module.php trong thư mục module, mà trong số những người khác có chứa đoạn mã sau:Zend Framework 2 autoloading

public function getAutoloaderConfig() 
    { 
     return array(
      'Zend\Loader\ClassMapAutoloader' => array(
       __DIR__ . '/autoload_classmap.php', 
      ), 
      'Zend\Loader\StandardAutoloader' => array(
       'namespaces' => array(
        __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, 
       ), 
      ), 
     ); 
    } 

Bây giờ tôi đã làm một số đào bới xung quanh để thử và tìm ra những gì tự động load này là tất cả về. Theo tôi hiểu, tính năng tự động tải sử dụng spl_autoload_register() và là cách để tránh việc có require_once() ở mọi nơi trong mã. Vì vậy, khi cố gắng sử dụng một lớp chưa được xác định, phương thức autoload() đã được đăng ký sẽ được chạy, thao tác này đơn giản thực hiện tra cứu mảng và bao gồm tệp như dưới đây nếu nó được thêm vào.

// Zend/Loader/ClassMapAutoloader.php 
public function autoload($class) 
{ 
    if (isset($this->map[$class])) { 
     require_once $this->map[$class]; 
    } 
} 

Điều này có vẻ thông minh do hiệu suất. Tôi hy vọng những gì tôi vừa viết là chính xác. Dựa trên điều này, tôi đang cố gắng tìm ra những gì đang xảy ra trong getAutoloaderConfig() từ đoạn mã đầu tiên, nhưng tôi khá bối rối. Dường như mảng được trả về bằng phương pháp này được sử dụng cho AutoloaderFactory::factory(), nhưng tôi không chắc chắn về mục đích gì. Ngay lập tức các trình nạp tự động với các tùy chọn có vẻ như, nhưng chính xác những gì đã làm, tôi không chắc chắn. Tôi đoán mục nhập thứ hai của mảng xác định nơi để tìm các tệp nguồn cho không gian tên của mô-đun - ít nhất đó sẽ là phỏng đoán của tôi. Mục đầu tiên tôi, tuy nhiên, không chắc chắn về. Trong hướng dẫn sử dụng, nó nói như sau:

Khi chúng tôi đang phát triển, chúng tôi không cần tải các tập tin qua sơ đồ lớp, để chúng tôi cung cấp một mảng trống cho trình nạp tự động lớp.

Tệp chỉ trả về một mảng trống. Tôi không chắc mục đích của ClassMapAutoloader này là gì.

Xin lỗi nếu điểm của tôi không rõ ràng; về cơ bản tôi đang cố gắng tìm ra những gì đang xảy ra trong getAutoloaderConfig() và những gì mymodule/autoload_classmap.php được sử dụng cho. Nếu ai đó có thể làm sáng tỏ điều này, điều đó sẽ được nhiều người đánh giá cao!

+8

Zend được thiết kế vô lý. – wesside

+1

Tuyệt đối. Nhưng tôi nghĩ rằng nếu bạn tìm thấy cách của bạn xung quanh nó, nó thực sự thực sự mạnh mẽ. Giống như Magento. –

+0

Tôi sử dụng nó tại nơi làm việc, nó có thăng trầm. Tôi thích Kohana mặc dù, và sử dụng bất kỳ thư viện Zend tôi có thể cần. Xin lỗi @ andy124, chưa sử dụng 2, xin lỗi để chiếm đoạt câu hỏi của bạn. – wesside

Trả lời

21

Sơ đồ lớp là ở đó để hiển thị PHP cách trực tiếp nhất cho một lớp học. Về cơ bản, nói "Bạn bạn đang tìm kiếm A\Class\Youre\Looking\For, lựa chọn nào tốt hơn tập tin này:. xyz.php này sẽ được thể hiện như thế này:

return array(
    'A\Class\Youre\Looking\For' => ___DIR__.'/xyz.php' 
) 

Nếu không có nó PHP có chạy qua chuỗi autoloader toàn bộ, có thể Tại sao nó lại nói một cái gì đó về "như chúng ta đang phát triển"? Bởi vì các tập tin classmap thường được tạo ra trên máy chủ sản xuất bởi một số kịch bản. Về cơ bản, đừng lo lắng về nó quá nhiều ngay bây giờ. ...

Phương pháp getAutoloaderConfig() chỉ có ở đó để mang lại cho bạn sự linh hoạt trong các ứng dụng thực sự nâng cao. Hầu hết thời gian bạn chỉ có thể sử dụng Skeleto Mã boilerplate của nApplication và SkeletonModule và để nó một mình. Thực sự, bạn thậm chí có thể giết một phần 'Zend\Loader\ClassMapAutoloader' => array(__DIR__ . '/autoload_classmap.php',) bây giờ.

Nó chỉ là một cái móc cho những cải tiến trong tương lai và không có gì phải lo lắng quá nhiều nếu bạn chỉ mới bắt đầu với ZF2 (như tôi;).

+0

Cảm ơn bạn. Những gì bạn đã viết về ClassMapAutoloader có ý nghĩa trong ví dụ của bạn, nhưng tôi không chắc chắn lý do tại sao khóa trong mảng là 'Zend \ Loader \ ClassMapAutoloader'. Giá trị đề cập đến một tệp PHP thậm chí không phải là một lớp; nó chỉ trả về một mảng.Tôi đoán là nó sẽ nói cho 'ClassMapAutoloader' xem trong tập tin đó để cấu hình bản đồ lớp. Không phải là tôi sẽ sử dụng nó ngay bây giờ, nhưng là mục đích của 'autoload_classmap.php' sau đó chỉ trả về một mảng các tên lớp như là khóa và đường dẫn là giá trị? Theo tôi hiểu từ câu trả lời của bạn, điều này là không cần thiết, nhưng chỉ là một tối ưu hóa. – Andy0708

+1

Zend \ Loader \ ClassMapAutoloader là một lớp. Xem https://github.com/zendframework/zf2/blob/master/library/Zend/Loader/ClassMapAutoloader.php Vì vậy, nó nói "sử dụng ClassMapAutoloader và cung cấp cho nó tệp autoload_classmap.php làm tham số". Trình nạp tự động sau đó sử dụng mảng được trả về từ tệp đó để ánh xạ các lớp tới các tệp cụ thể. Đó có phải là một chút rõ ràng hơn? –

8

ZF2 có sẵn một số bộ nạp tự động.

2 phổ biến nhất (hoặc 2 nhà phát triển tương tác trực tiếp với bất kỳ tỷ lệ nào) là Zend\Loader\ClassMapAutoloaderZend\Loader\StandardAutoloader.

  1. Trình tự động nạp lớp thường được sử dụng ở cấp mô-đun để cung cấp cơ chế tra cứu mảng đơn giản nhưng nhanh chóng. Nó được cấu hình với một mảng kết hợp gồm key => value cặp, với khóa đại diện cho lớp và giá trị đại diện cho tên tệp xác định lớp.

  2. Trình tự động nạp tiêu chuẩn, mặt khác, được thiết kế để giữ một danh sách "không gian tên" và thư mục cơ sở . Điều gì là để sau đó tạo đường dẫn đến lớp được tham chiếu, nhưng chưa được tải, bằng cách thêm đường dẫn thư mục cơ sở cho không gian tên đó vào tên của lớp, để đến đường dẫn tuyệt đối cuối cùng tới tệp lớp học, trong đó sau đó cố gắng bao gồm. Bạn có thể nhanh chóng điền tệp classmap_autoload.php bằng cách chạy /path/to/ZF2/bin/classmap_generator.php hoặc zftool.phar tạo sơ đồ lớp .

Zend\Loader\AutoloaderFactory được thiết kế để quản lý các bộ nạp tự động khác nhau và để đảm bảo không có xung đột. Cuối cùng, tất nhiên, tất cả các khả năng tự động tải sẽ tận dụng tính năng tự động tải SPL của PHP.

Mục đích của getAutoloaderConfig() là để xác định nhà máy tự động tải có bộ nạp tự động có sẵn cho không gian tên của mô-đun này.

Trong ví dụ được hiển thị ở trên, điều đó sẽ là, theo thứ tự ưu tiên, trình tự động tải lớp, theo sau là trình nạp tự động tiêu chuẩn. Nếu bạn không muốn sử dụng trình tự động tải lớp cho mô-đun đó, hãy xóa tham chiếu khỏi mảng được trả về bởi getAutoloaderConfig().

Tên phương thức getAutoloaderConfig() được đặt trước. Nếu phương thức này được xác định, trong quá trình khởi tạo mô-đun, người nghe (Zend\ModuleManager\AutoloaderListener) được đính kèm, truy xuất cấu hình được trả về bằng phương pháp này và thêm nó vào cấu hình tổng hợp.

+0

+1 Giải thích rất rõ ràng và đơn giản. – Andy0708

3

Ứng dụng web bao gồm nhiều lớp PHP và mỗi lớp thường nằm trong một tệp riêng biệt. Điều này giới thiệu nhu cầu của bao gồm các tệp.

Khi ứng dụng của bạn tăng kích thước, có thể khó bao gồm mỗi tệp cần thiết. Bản thân Zend Framework 2 bao gồm hàng trăm tệp, và có thể rất khó tải toàn bộ thư viện và tất cả các phụ thuộc của nó theo cách này là . Hơn nữa, khi thực thi mã kết quả, trình thông dịch PHP sẽ mất thời gian CPU để xử lý từng tệp được bao gồm, ngay cả khi bạn không tạo một cá thể của lớp của nó.

Để khắc phục sự cố này, trong PHP 5.1, tính năng tự động tải lớp đã được giới thiệu. Chức năng PHP spl_autoload_register() cho phép bạn đăng ký một chức năng tự động tải tự động nạp. Đối với các trang web phức tạp, bạn thậm chí có thể tạo ra một số chức năng tự động tải, được ghép trong một ngăn xếp .

Trong thực hiện kịch bản, nếu PHP thông dịch viên gặp một tên lớp đó chưa được xác định nhưng, nó gọi tất cả các chức năng autoloader đăng ký đến lượt nó, cho đến khi một trong hai chức năng autoloader bao gồm các lớp học hoặc "không tìm thấy" lỗi là nâng lên. Điều này cho phép tải "lười", khi trình thông dịch PHP xử lý định nghĩa lớp chỉ tại thời điểm yêu cầu lớp, khi nó thực sự cần thiết.

Vì nhà cung cấp của mỗi thư viện sử dụng quy ước đặt tên và quy tắc tổ chức tệp riêng, bạn sẽ phải đăng ký chức năng tự động tải tùy chỉnh khác nhau cho mỗi thư viện phụ thuộc, gây khó chịu (và thực sự đây là công việc không cần thiết). Để giải quyết vấn đề này, tiêu chuẩn PSR-0 đã được giới thiệu.

Các PSR-0 standard (PSR là viết tắt của tiêu chuẩn PHP Khuyến nghị) xác định cấu trúc mã khuyến cáo rằng một ứng dụng hoặc thư viện phải tuân để đảm bảo khả năng tương tác autoloader.

Mỗi mô-đun của ứng dụng web đăng ký trình nạp tự động, giúp bạn có thể tự động tải bất kỳ lớp PHP nào trong mô-đun của mình. Điều này được thực hiện với phương pháp getAutoloaderConfig() của lớp Module.

ZF2 có một thành phần đặc biệt có tên Zend\Loader, trong đó có việc triển khai của hai lớp autoloader thường được sử dụng: các autoloader chuẩn (Zend\Loader\StandardAutoloader) và bản đồ lớp autoloader (Zend\Loader\ClassMapAutoloader).

Thực tế là các mô-đun ứng dụng dựa trên ZF2 phù hợp với tiêu chuẩn PSR-0 làm cho nó có thể sử dụng bộ nạp tự động tiêu chuẩn.

Trình tự động tải lớp bản đồ lớp có thể được sử dụng để thay thế nhanh hơn cho trình nạp tự động tiêu chuẩn. Trình tải tự động này hy vọng bạn chuyển nó thành mảng bản đồ lớp. Mỗi cặp khóa => giá trị cặp của lớp bản đồ là, tương ứng, tên lớp và đường dẫn đến tệp PHP chứa lớp đó.

Khái niệm về tự động tải trong Zend Framework 2 cũng được giải thích rõ ràng trong Using Zend Framework 2 sách.