2012-02-23 28 views
12

Tôi đang tìm hiểu về các không gian tên trong PHP 5.3 và tôi muốn sử dụng Tự động tải không gian tên. Tôi đã tìm thấy số này SplClassLoader class, nhưng tôi không thể tìm ra cách hoạt động của nó.Tự động tải bằng PHP với SplClassLoader?

Hãy nói rằng tôi có cấu trúc thư mục như thế này:

system 
    - framework 
    - http 
     - request.php 
     - response.php 
index.php 
SplClassLoader.php 

Làm thế nào để kích hoạt tính năng tự động load lớp? Không gian tên nào cần request.phpresponse.php có?

Đây là request.php:

namespace framework\http; 

class Request 
{ 
    public function __construct() 
    { 
     echo __CLASS__ . " constructer!"; 
    } 
} 

Và đây là response.php:

namespace framework\http; 

class Request 
{    
    public function __construct() 
    {  
     echo __CLASS__ . " constructed!";     
    }   
} 

Và trong index.php tôi có:

require_once("SplClassLoader.php"); 
$loader = new SplClassLoader('framework\http', 'system/framework'); 
$loader->register(); 

$r = new Request(); 

tôi nhận được thông báo lỗi này:

Fatal error: Class 'Request' not found in C:\wamp\apache\htdocs\php_autoloading\index.php on line 8 

Tại sao tính năng này không hoạt động? Làm thế nào tôi có thể sử dụng SplClassLoader trong các dự án của tôi để nó tải/yêu cầu các lớp học của tôi, và làm thế nào tôi nên thiết lập và đặt tên thư mục và không gian tên?

+0

Tôi nghĩ tên tệp và thư mục của bạn có thể cần phải bắt đầu bằng chữ in hoa? –

+0

@Adrian Macneil: Không có trong cửa sổ, nhưng bạn nói đúng, điều này nên được thực hiện. – hakre

Trả lời

11

tập tin và thư mục của bạn tên cần phải phù hợp với trường hợp của các lớp học và không gian tên của bạn chính xác, như trong ví dụ sau:

system 
    - framework 
    - http 
     - Request.php 
     - Response.php 
index.php 
SplClassLoader.php 

Thêm vào đó, bạn chỉ cần khai báo namespace gốc khi đăng ký các đối tượng SplClassLoader, như sau:

<?php 

    require_once("SplClassLoader.php"); 
    $loader = new SplClassLoader('framework', 'system/framework'); 
    $loader->register(); 

    use framework\http\Request; 

    $r = new Request(); 

?> 

Hy vọng điều này sẽ hữu ích!

+3

Tôi nghĩ rằng 'sử dụng framework \ http \ Request;' là cần thiết trước khi bạn tham khảo 'new Request()' ... trừ khi tôi đang thiếu một cái gì đó. –

+0

@MarkFox Đã chỉnh sửa để sửa lỗi. Cảm ơn cho những người đứng đầu lên. – rintaun

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