php中的命名空間namespace

==============================================
     php中的命名空間namespace
==============================================


一、命名空間概述:
    什麼是命名空間?從廣義上來說,命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念。
    例如,在操作系統中目錄用來將相關文件分組,對於目錄中的文件來說,它就扮演了命名空間的角色。
    具體舉個例子,如文件foo.txt 可以同時在目錄/home/greg 和 /home/other 中存在,但在同一個目錄中不能存在兩個 foo.txt 文件。
    另外,在目錄 /home/greg 外訪問 foo.txt 文件時,我們必須將目錄名以及目錄分隔符放在文件名之前得到 /home/greg/foo.txt。
    這個原理應用到程序設計領域就是命名空間的概念。 
    
    
二、定義命名空間:
    1. 雖然任意合法的PHP代碼都可以包含在命名空間中,但只有三種類型的代碼受命名空間的影響,它們是:類,函數和常量。 
    2. 命名空間通過關鍵字namespace 來聲明。如果一個文件中包含命名空間,它必須在其它所有代碼之前聲明命名空間。
    實例:
        <?php
            namespace MyProject;


            const CONNECT_OK = 1;
            class Connection { /* ... */ }
            function connect() { /* ... */  }


        ?>
      
     (瞭解)在聲明命名空間之前唯一合法的代碼是用於定義源文件編碼方式的 declare 語句。declare(encoding='ISO-8859-1');


三、定義子命名空間:
    1. 與目錄和文件的關係很象,PHP 命名空間也允許指定層次化的命名空間的名稱。因此,命名空間的名字可以使用分層次的方式定義: 
    
        <?php
            namespace MyProject\Sub\Level;


            const CONNECT_OK = 1;
            class Connection { /* ... */ }
            function connect() { /* ... */  }
        ?>
        
四、在同一個文件中定義多個命名空間(不推薦):
    1. 也可以在同一個文件中定義多個命名空間。在同一個文件中定義多個命名空間有兩種語法形式。     
        <?php
        namespace MyProject;


        const CONNECT_OK = 1;
        class Connection { /* ... */ }
        function connect() { /* ... */  }


        namespace AnotherProject;


        const CONNECT_OK = 1;
        class Connection { /* ... */ }
        function connect() { /* ... */  }
        ?>


     2. 不建議使用上面實例1的這種語法在單個文件中定義多個命名空間。建議使用下面的大括號形式的語法。
        在實際的編程實踐中,非常不提倡在同一個文件中定義多個命名空間。這種方式的主要用於將多個 PHP 腳本合併在同一個文件中。
            <?php
            namespace MyProject {


            const CONNECT_OK = 1;
            class Connection { /* ... */ }
            function connect() { /* ... */  }
            }


            namespace AnotherProject {


            const CONNECT_OK = 1;
            class Connection { /* ... */ }
            function connect() { /* ... */  }
            }
            
            //不包含在命名空間中的代碼
            namespace { // 全局代碼
            session_start();
            $a = MyProject\connect();
            echo MyProject\Connection::start();
            }
            ?>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章