我無法自動加載以使用命名空間。下面是我爲這個創建的目錄結構:命名空間自動加載無法正常工作
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
,它是包含目錄的名稱,但它沒有幫助)。
謝謝,這有幫助!但爲什麼不應該使用__autoload()函數?另外,該手冊沒有提及「spl_autoload_register()」不需要位於全局名稱空間的事實。 – dotslash
我認爲這是理所當然的。你可以定義'\ myns \ __ autoload','\ another_namespace \ __ autoload'等。但是php可以調用的唯一函數就是在全局空間中。這就是爲什麼'__autoload'受到限制和沮喪的原因。 'spl_autoload_register'爲您提供了一種更靈活的方式來註冊自動加載,並且不需要在全局名稱空間中進行。 – Federkun