2015-10-07 105 views
0

我無法自動加載以使用命名空間。下面是我爲這個創建的目錄結構:命名空間自動加載無法正常工作

index.php 
app/ 
    utils/ 
    sys/ 
     DirReader.php 
    helpers/ 
     DB.php 

index.php包含自動加載器,其中包括文件DirReader.php和db.php中。

這裏的index.php的樣子:

<?php 

function __autoload($ns_str) //ns_str = namespace string 
{ 
    $path = str_replace('\\', DIRECTORY_SEPARATOR, $ns_str); 
    //echo "**$path**\n"; 
    require_once "$path.php"; 
} 

use \app\utils\sys as sys; 
use \app\utils\helpers as helpers; 

$dir = new sys\DirReader(); 
$db = new helpers\DB(); 

這裏的DirReader.php

<?php 
namespace app\utils\sys; 

class DirReader 
{ 
    public function __construct() 
    { 
     echo "DirReader object created!\n"; 
    } 
} 

而這裏的DB.php

<?php 
namespace app\utils\helpers; 

class DB 
{ 
    public function __construct() 
    { 
     echo "DB object created!\n"; 
    } 
} 

示例工作正常,但是當我添加命名空間聲明到index.php,它失敗:

<?php 
    namespace myns; 
    function __autoload($ns_str) //ns_str = namespace string 
    { /*. . .*/ 

PHP Fatal error: Class 'app\utils\sys\DirReader' not found in /var/www/html/php_learn/autoloading_1/index.php on line 15 PHP Stack trace: PHP 1. {main}() /var/www/html/php_learn/autoloading_1/index.php:0

根據我這個錯誤應該不會來了,因爲我已經在index.php使用名稱空間時使用絕對名稱。我知道說像use app\utils\sys as sys;這樣的內容會失敗,因爲那麼名稱空間將會相對於myns進行搜索,這裏沒有任何東西存在。但我不知道爲什麼我的代碼不工作。 (我也嘗試將index.php中名稱空間的名稱更改爲autoloading_1,它是包含目錄的名稱,但它沒有幫助)。

回答

1

__autoload函數必須在全局空間中定義。 否則使用spl_autoload_register。不鼓勵使用__autoload()

+0

謝謝,這有幫助!但爲什麼不應該使用__autoload()函數?另外,該手冊沒有提及「spl_autoload_register()」不需要位於全局名稱空間的事實。 – dotslash

+1

我認爲這是理所當然的。你可以定義'\ myns \ __ autoload','\ another_namespace \ __ autoload'等。但是php可以調用的唯一函數就是在全局空間中。這就是爲什麼'__autoload'受到限制和沮喪的原因。 'spl_autoload_register'爲您提供了一種更靈活的方式來註冊自動加載,並且不需要在全局名稱空間中進行。 – Federkun