ホームページ  >  記事  >  バックエンド開発  >  PHP の名前空間とは何ですか?名前空間を使用する理由

PHP の名前空間とは何ですか?名前空間を使用する理由

青灯夜游
青灯夜游転載
2020-07-17 15:36:053826ブラウズ

PHP の名前空間とは何ですか?名前空間を使用する理由

ステートメント: この記事は最新の PHP に基づいており、基礎となるソース コードを誰でも簡単に学習できるように、例として Laravel ソース コードを使用しています。

1. ネームスペースとは何ですか?

最新の PHP 機能を 1 つだけ知っていれば十分です。ネーミングスペース。ネームスペースは PHP5.3.0 で導入されました。その機能は、オペレーティング システムのファイル システムのディレクトリ構造に似た仮想階層構造に従って PHP コードを編成することです。

[関連する推奨事項: PHP チュートリアル ]

名前空間は最新の PHP コンポーネント エコロジーの基盤であり、最新の PHP コンポーネント フレームワーク コードはそれぞれのグローバルに配置されます。他のベンダーが使用する一般的なクラス名との競合を避けるために、独自のベンダー名前空間で名前を付けます。

実際の PHP コンポーネントが名前空間をどのように使用するかを見てみましょう。 Laravel フレームワークの Http コンポーネントは、HTTP リクエストとレスポンスを管理するために使用されます。このコンポーネントは、Request や Response などの共通のクラス名を使用します。他の多くの PHP コンポーネントも同様のクラス名を使用します。他の PHP コードも同じクラス名を使用するため、このコンポーネントの使い方は?

実際、このコンポーネントのコードは唯一のメーカー名空間 Illuminate に配置されているため、安心して使用できます。

GitHub (https://github.com/laravel/framework/blob/master/src/Illuminate/Http/Response.php) でこのコンポーネントのリポジトリを開き、Response.php# を見つけます。 ##ファイル:

コードの 3 行目は次のとおりです:

namespace Illuminate\Http;

この行は PHP 名前空間宣言ステートメントです。名前空間を宣言するコードは次のようになります。常に

タグの後の最初の行に配置されます。この名前空間の宣言ステートメントから、Response がメーカーの名前空間 Illuminate (最上位の名前空間) にあることがわかります。 ## クラスはサブ名前空間 Http にあります。Response.php ファイルと同じレベルにある他のファイルを見ると、それらはすべて同じ名前空間を使用していることがわかります。宣言文。 名前空間の役割は、関連するファイルをファイル システムの同じディレクトリに配置するのと同じように、関連する PHP クラスをカプセル化して整理することです。 PHP 名前空間は、オペレーティング システムの物理ファイル システムとは異なります。これは仮想概念であり、必ずしもファイル システムのディレクトリ構造とまったく同じである必要はありません。ただし、ほとんどの PHP コンポーネントは、広く使用されているファイル システムと互換性があります。 PSR-4 オートロード標準。ネームスペースは、対応するファイル システムのサブディレクトリに配置されます。

2. 名前空間を使用する理由

前述したように、私たちのコードは他の開発者のコ​​ード名、インターフェイス名、関数または定数の名前。名前空間が使用されていない場合、名前が競合し、PHP 実行エラーが発生します。名前空間を使用してコードをメーカー固有の名前空間に配置することで、コードは他の開発者と同じクラス名、インターフェイス名、関数、または定数名を使用できます。

もちろん、依存関係が少数しかない小規模な個人プロジェクトを開発している場合は、クラス名の競合は問題にならないかもしれませんが、チームで作業し、多くのサードパーティ依存関係を使用する大規模なプロジェクトを開発している場合は、名前の競合の問題は、プロジェクトの依存関係によってグローバル名前空間に導入されたクラス、インターフェイス、関数、定数を制御できないため、名前空間が使用されます。

3. ネームスペースの宣言

PHP クラス、インターフェイス、関数、定数はすべてネームスペース内にあります。ネームスペースの宣言は非常に簡単です。 タグの後の最初の行で宣言されている場合、宣言ステートメントは

namespace で始まり、スペース、名前空間の名前、最後に が続きます。 ; ###終わり。 名前空間は、トップレベルのベンダー名を設定するためによく使用されます。たとえば、ベンダー名を LaravelAcademy に設定します:

<?php
   namespace LaravelAcademy;

この名前空間の後に宣言されたすべての PHP クラス宣言文、インターフェイス、関数、定数はすべて LaravelAcademy 名前空間にあり、Laravel Academy と何らかの関係があります。アカデミーで使用されているコードを整理したい場合はどうすればよいでしょうか?答えは、サブ名前空間を使用することです。

サブ名前空間の宣言方法は前の例とまったく同じです。唯一の違いは、名前空間とサブ名前空間を区切るために \
記号を使用する必要があることです。名前空間、例:

<?php
   namespace LaravelAcademy\ModernPHP;

この名前空間の後のすべてのクラス、インターフェイス、関数、定数は LaravelAcademy\ModernPHP にあります。同じ名前空間内のクラスを同じ PHP ファイル内で宣言する必要はありません。PHP ファイルの先頭で名前空間またはサブ名前空間を指定できます。このとき、このファイルのコードは名前空間またはサブ名前空間の一部です。 -名前空間。したがって、同じ名前空間に属する複数のクラスを異なるファイルに記述することができます。

注:厂商命名空间是最顶层的命名空间,也是最重要的命名空间,用于识别品牌或组织,必须具有全局唯一性。子命名空间相对而言没那么重要,但是可以用于组织项目的代码。

4、导入和别名

在命名空间出现之前,PHP开发者使用Zend风格的类名解决命名冲突问题,这是一种类的命名方案,因Zend框架而流行,这种命名方案在PHP类名中使用下划线的方式表示文件系统的目录分隔符。这种约定有两个作用:其一,确保类名是唯一的;其二,原生的自动加载器会把类名中的下划线替换成文件系统的目录分隔符,从而确定文件的路径。例如,Zend_Cloud_DocumentService_Adapter_WindowsAzure_Query类对应的文件是Zend/Cloud/DocumentService/Adapter/WindowsAzure/Query.php。可以看出,这种命名有个缺点:类名特别长。

现代的PHP命名空间也有这个问题,例如上述Response类完整的全名是Illuminate\Http\Response,幸好,我们可以通过导入以及创建别名的方式来改变这一状况。

导入的意思是指,在每个PHP文件中告诉PHP想使用哪个命名空间、类、接口、函数和常量,导入后就不用使用全名了:

  <?php
    use Illuminate\Http\Response;

    $response = new Response(‘Oops’, 400);
    $response->send();

我们通过use关键字告诉PHP,我们想使用Illuminate\Http\Response类,我们只需要输入一次完全限定的类名,随后实例化Response的时候,无需使用完整的类名。

如果觉得这样的类名还是长,可以创建别名。创建别名指的是告诉PHP我要使用简单的名称引用导入的类、接口、函数或常量:

   <?php

    use Illuminate\Http\Response as Res;

    $res = new Res(‘Oops’, 400);
    $res->send();

从PHP 5.6开始还可以导入函数和常量,不过要调整use关键字的句法,如果要导入函数,需要使用use func

  <?php
    use func Namespace\functionName

    functionName();

如果想导入常量,可以使用use constant

  <?php
    use constant Namespace\CONST_NAME;

    echo CONST_NAME;

当然也支持别名,创建方式和类一样。

5、实用技巧

多重导入

如果想要在PHP文件中导入多个类、接口、函数或常量,需要在PHP文件的顶部使用多个use语句,PHP支持用简短的语法把多个use语句写成一行:

  <?php
    use Illuminate\Http\Request,
    Illuminate\Http\Response;

但是为了可读性,建议不要这么写,还是一行写一个use语句比较好:

  <?php
    use Illuminate\Http\Request;
    use Illuminate\Http\Response;

一个文件使用多个命名空间

PHP允许在一个文件中定义多个命名空间:

<?php
    namespace Foo {
      //声明类、接口、函数、常量
    }

    namespace Bar {
      //声明类、接口、函数、常量
    }

但这么做不好,违背了“一个文件一个类”的良好实践,因此不建议这么做。

全局命名空间

如果引用的类、接口、函数和常量没有指定命名空间,PHP假定引用的类、接口、函数和常量在当前的命名空间中。如果要使用其他命名空间的类、接口、函数或常量,需要使用完全限定的PHP类名(命名空间+类名)。

有些代码在全局命名空间中,没有命名空间,比如原生的Exception类就是这样。在命名空间中引用全局的代码时,需要在类、接口、函数或常量前加\符号:

<?php
    namespace My\App;

    class Foo {
      public function doSomething() {
         throw new \Exception();
      }
    }

自动加载

命名空间还为PHP-FIG制定的PSR-4自动加载标准奠定了坚实的基础,大多数现代的PHP组件都使用了这种自动加载模式,使用依赖管理器Composer可以自动加载项目的依赖,后续我们还会详细介绍Composer和PHP-FIG,现在你只需要知道没有命名空间,就没有现代的PHP生态系统和基于组件的新型架构,由此可见命名空间的重要性。

相关学习推荐:PHP编程从入门到精通

以上がPHP の名前空間とは何ですか?名前空間を使用する理由の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。