<pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

          <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

          <p id="bbfd9"></p>

          <p id="bbfd9"><cite id="bbfd9"></cite></p>

            <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

            <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
            <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
            php語言

            PHP關鍵特性之命名空間實例

            時間:2025-02-12 13:27:11 php語言 我要投稿
            • 相關推薦

            PHP關鍵特性之命名空間實例

              命名空間主要是為了解決代碼中類和函數可能存在沖突的問題。這篇文章給大家介紹php關鍵特性之命名空間,包括命名空間的定義等知識點,需要的朋友參考下吧.

              命名空間主要是為了解決代碼中類和函數可能存在沖突的問題,而這個特性其他語言一早就有,PHP則是姍姍來遲,它的出現催生了 PSR-4 的誕生,從而也催生了 Composer 的興起,所以是非常重要的特性。

              命名空間的定義

              命名空間是一個容器,這個容器主要是為了識別其下的類和函數。一旦定義了命名空間,它下面的代碼就屬于這個命名空間了,所以命名空間的定義要在代碼的最開始行。

              對于同一個包來說,同一個命名空間或者子命名空間的代碼沒有必要在一個 PHP 文件中定義,子命名空間下的代碼是為了完成特定模塊的工作,組合起來就是一個包完整的命名空間。

              假如編寫的代碼沒有定義命名空間,那說明它屬于全局的命名空間(\ 符號),所以能夠直接引用類或者函數(不用添加 \ 符號)。

              引用命名空間標識符的三種方式

              (1)Fully-qualified name

              類似于操作系統上的絕對路徑,而且是完整的路徑,所以在理解的時候不會有誤解。

              比如在 new \A\B\C ,那么 C 就被會解析到 A\B 命名空間下的 C 類。

              (2)Qualified name

              類似于操作系統上的相對路徑,它包含部分名字并被引用到當前的命名空間。

              比如 B\C() 在命名空間 A 下調用,則最終引用的命名空間就是 A\B\C()。

              (3)Unqualified name

              類似于Qualified name,但是沒包括子命名空間。

              比如 C() 在命名空間 A\B 下調用,則最終引用的命名空間就是 A\B\C()。

              通過一個例子來說明三種引用方式:

              ?

              1

              2

              3

              4

              5

              6

              7

              8

              9

              10

              11

              12

              namespace \Example;

              require_once "fnction.php";

              class ClassA {}

              function Function() {}

              //完全限定名稱

              \Example\Function();

              \Example\B\Function();

              //限定名稱

              B\Function(); //指向 \Example\B\Function();

              //非限定名稱

              $test = new ClassA(); //resolves to \Example\ClassA

              Function(); //指向 \Example\Function

              注意:

              ?Inside a namespace,假如在 current scope 沒有發現函數和常量的定義,PHP 不會報錯。而是去全局命名空間中尋找。

              ?Inside a namespace,假如在 current scope 沒有發現類的定義,則 PHP 會直接報錯,不會去全局域中找對應的類,所以假如你需要引用一個 internal 或用戶自定義的類,必須使用完全限定名稱。

              先舉個簡單的例子,首先編寫一段代碼(定義在命名空間下),命名為 function.php :

              ?

              1

              2

              3

              4

              5

              6

              7

              8

              9

              10

              11

              12

              13

              14

              15

              16

              17

              namespace Foo\Bar\subnamespace;

              const FOO = 1;

              function foo()

              {

              return "foo\r\n";

              }

              class foo

              {

              static function staticmethod()

              {

              return __METHOD__ . "\r\n" ;

              }

              function foofunction()

              {

              return __METHOD__ . "\r\n" ;

              }

              }

              再編寫一段代碼 test.php,也是處于命名空間之下的代碼:

              ?

              1

              2

              3

              4

              5

              6

              7

              8

              9

              10

              11

              12

              13

              14

              15

              16

              17

              18

              19

              20

              21

              22

              23

              24

              25

              26

              27

              28

              namespace secondsp;

              include 'function.php';

              class foo

              {

              function foofunction()

              {

              return __METHOD__ . "\r\n" ;

              }

              }

              function is_file($file)

              {

              return true ;

              }

              //非限定名稱:實例化secondsp\foo類對象

              $obj = new foo;

              echo $obj->foofunction();

              //實例化Foo\Bar\subnamespace\foo 類對象

              $obj = new Foo\Bar\subnamespace\foo ;

              echo $obj->foofunction();

              //代碼會報錯,在命名空間內部,假如無法找到當前命名空間下的類,則會報錯

              //$obj = new ArrayObject(array(1));

              $obj = new \ArrayObject(array(1));

              //在命名空間內部,假如無法找到當前命名空間下的函數或者常量,則會尋找 native function

              echo strlen("nihao");

              //引用當前命名空間下的函數

              var_dump(is_file('nihao')); //True

              //引用全局函數

              var_dump(\is_file('nihao')); //False

              導入,別名

              假如要使用的命名空間層級很長且數量很多,那么在使用的時候特別麻煩,所以可以使用 use 關鍵字導入命名空間、類、常量、函數等,然后可以使用它們直接引用完整的名稱。而 alias 關鍵字可以給導入的類和函數等重命名。

              舉個例子如何使用 use 關鍵字,該代碼處于全局命名空間之下:

              ?

              1

              2

              3

              4

              5

              6

              7

              8

              9

              10

              11

              12

              13

              14

              15

              16

              17

              18

              19

              20

              21

              22

              include 'function.php';

              use Foo\Bar\subnamespace\foo ;

              $obj = new foo;

              echo $obj->foofunction();

              use Foo\Bar\subnamespace\foo as aliasfunname;

              $obj = new aliasfunname;

              echo $obj->foofunction();

              use Foo\Bar\subnamespace ;

              $obj = new subnamespace\foo ;

              echo $obj->foofunction();

              use Foo\Bar\subnamespace as aliasname;

              $obj = new aliasname\foo ;

              echo $obj->foofunction();

              //由于調用代碼并不在命名空間內,所以對于全局的類,無需引入使用

              $obj = new ArrayObject(array(1));

              //導入一個函數

              use function Foo\Bar\subnamespace\foo  ;

              echo foo();

              use function Foo\Bar\subnamespace\foo as func;

              echo func();

              use const Foo\Bar\subnamespace\FOO;

              //echo FOO;

              總結:

              ?和 Python 不一樣,PHP 中的命名空間是語義上的一種概念,和具體代碼的位置、布局沒有關系,換句話說,使用命名空間的代碼需要自己引入庫文件(所有文件),至于庫文件如何組織無所謂;而在 Python 中,假如模塊或包中有一個 __init__.py 文件,則 Python 解析器會自動引入包或所有模塊的文件。

              ?PHP 中作用域的概念很弱化,全局域和局部域分的很清楚,比如在函數或類中無法引用全局空間中的變量。而在命名空間則不同,定義命名空間的代碼,假如找不到對應命名空間下的常量和函數,則會使用全局的常量和函數;而假如找不到對應名命名空間下的類(包括自定義類),則代碼直接報錯。

              ?通過 use 關鍵字使用命名空間的,無須通過完全限定名稱的方式(\ 符號)導入,因為 PHP 已經假設導入的是完全限定的命名空間。

              ?通過 use 關鍵字可以導入常量、函數、類、接口、其他命名空間。

              ?命名空間是一種語言特性,為了追求更有效的使用,應該有一種使用規范和自動加載機制,這就是 PSR-4 規范。

            【PHP關鍵特性之命名空間實例】相關文章:

            PHP中的命名空間介紹09-01

            PHP中命名空間的方法05-07

            PHP curl之操作實例09-08

            php之readdir函數用法實例09-21

            PHP use類文件中的命名空間問題08-25

            PHP的Socket通信之UDP通信實例07-27

            PHP語言的命名規則09-29

            php畫圖實例07-16

            php查詢mysql的實例09-09

                    <pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

                    <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

                    <p id="bbfd9"></p>

                    <p id="bbfd9"><cite id="bbfd9"></cite></p>

                      <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

                      <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
                      <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
                      飘沙影院