PHP 使用命名空間(namespace),實現自動加載


示例:

#/DB/MySql.class.php也就是DB文件夾下有MySql.class.php文件

namespace DB;

class MySql
{

    public function __construct()
    {
        var_dump(__FILE__);
    }
}
#/index.php

namespace Home;

use DB\MySql;

$mysql = new MySql();

報錯

Fatal error: Class 'DB\MySql' not found in D:\localhost\demo\space\index.php on line 23

修改

修改 index.php 改成如下,可以了,但是為什么不能自動加載?

namespace Home;

use DB\MySql;

spl_autoload_register(function ($class) {
    if ($class) {
        $file = str_replace('\\', '/', $class);
        $file .= '.class.php';
        if (file_exists($file)) {
            include $file;
        }
    }
});

$mysql = new MySql();

要點:

第一:

命名空間跟文件加載並無直接關系,只是有些語言,將命名空間結構和文件結構對應起來了。 以php為例,一般的命名空間結構,跟php文件結構是存在映射關系的,通過命名空間名稱,就能算出該類的實際存儲位置, 然后實例化的時候,會觸發用設置的spl自動加載函數將文件引入。

Xee:命名空間是事先通過自動導入或者include,require之類導入的,然后會根據命名空間對應起來,實現自動載入)

第二:

namespace Home;
use DB\MySql;
$mysql = new MySql();

實際執行代碼的時候是 new \DB\MySql(); 找不到這個文件的時候就會調用你的autoload函數 並file_exists("DB/MySql.class.php"),在當前目錄下查找這個文件,在找不到的情況下然后就是你看到的錯誤

Xee:在被調用的MySql.class.php文件中,也要有\DB\MySql的命名空間)

第三:

如果剛開始了解php命名空間,去看如何使用PHP命名空間;多翻翻使用命名空間的框架的源碼,如micro-mvc,slim等。

還有PSR-4——新鮮出爐的PHP規范,其中就有這個:

 *      // register the base directories for the namespace prefix
 *      $loader->addNamespace('Foo\Bar', '/path/to/packages/foo-bar/src');
 *      $loader->addNamespace('Foo\Bar', '/path/to/packages/foo-bar/tests');

第四:

我們常用 db\mysql,這種形式的命名空間!不是一定要使用\這個反斜線的,還可以使用例如:db::mysql;或者db_mysql等;要在自動查找類的函數方法中進行分析.

<參考:PHP命名空間 namespace 如何實現自動加載>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM