<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. 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

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人