PHP 名前空間の概要

不言
リリース: 2023-04-02 13:32:02
オリジナル
1260 人が閲覧しました

この記事では、主に参考価値のある PHP の名前空間を紹介します。皆さんにも共有します。困っている友達は参考にしてください。

PHP 名前空間とは何ですか?

# (PHP 5 >= 5.3.0、PHP 7)

ネームスペースとは何ですか?大まかに言えば、名前空間は物事をカプセル化する方法です。この抽象的な概念はさまざまな場所で見られます。たとえば、ディレクトリはオペレーティング システムで関連ファイルをグループ化するために使用され、ディレクトリ内のファイルの名前空間として機能します。たとえば、ファイル

foo.txt は、ディレクトリ /home/greg/home/other に同時に存在できますが、同じディレクトリには存在できません。 foo.txt ファイルが 2 つあります。さらに、ディレクトリ /home/greg の外にある foo.txt ファイルにアクセスする場合、ファイル名の前にディレクトリ名とディレクトリ区切り文字を入れて、/home を取得する必要があります。 /greg /foo.txt。この原理をプログラミングの分野に適用したのが、名前空間の概念です。

PHP では、クラス ライブラリやアプリケーションを作成するときにクラスや関数などの再利用可能なコードを作成するときに発生する 2 種類の問題を解決するために名前空間が使用されます。

  1. ユーザーが作成したコードと、PHP の内部クラス/関数/定数またはサードパーティのクラス/関数/定数の間で名前が競合します。

  2. 非常に長い識別子名 (通常、最初の種類の問題を軽減するために定義される) のエイリアス (または短い) 名を作成し、ソース コードの可読性を向上させます。

合法な PHP コードはすべて名前空間に含めることができますが、名前空間の影響を受けるのは次の種類のコードのみです。 クラス (抽象クラスと特性を含む) 、インターフェイス、関数、定数。

名前空間は、キーワード

namespace によって宣言されます。ファイルに名前空間が含まれている場合は、declare キーワードを除く他のすべてのコードの前に名前空間を宣言する必要があります。

名前空間を宣言する前の唯一の正当なコードは、ソース ファイルのエンコーディングを定義するために使用される

declare ステートメントです。さらに、空白を含むすべての PHP 以外のコードを名前空間宣言の前に置くことはできません。

<html>
<?php
namespace MyProject; // 致命错误 - 命名空间必须是程序脚本的第一条语句?>
ログイン後にコピー

さらに、PHP の他の言語機能とは異なり、同じ名前空間を複数のファイルで定義できるため、ファイルを分割できます。同じ名前空間の内容を異なるファイルに分割します。

1. 例 1 最初に 2 つのクラス ファイルを作成します

a.php

<?phpclass Test
{    public function ceshi(){        echo __FILE__;
    }
}
ログイン後にコピー
ログイン後にコピー

b.php

<?phpclass Test
{    public function ceshi(){        echo __FILE__;
    }
}
ログイン後にコピー
ログイン後にコピー

#index.php

<?php
require_once("a.php");
require_once("b.php");
ログイン後にコピー
#ここで、index.php ファイルを実行します

#致命的なエラーが見つかります: 致命的なエラー: クラスのテストを再宣言できません。 。 。明らかに、Test クラスは 2 回導入されており、2 つのファイル内のクラス名が同じで競合しているため、再宣言することはできません。このとき、この問題を解決するには名前空間が必要ですが、それは簡単です。

2.

例 2

2 つのクラス ファイルを少し変更します。 a.php

<?php
namespace demo1\a\Test;class Test
{    public function ceshi(){        echo __FILE__;
    }
}
ログイン後にコピー

b.php

<?php
namespace demo1\b\Test;class Test
{    public function ceshi(){        echo __FILE__;
    }
}
ログイン後にコピー

名前空間キーワードは、名前空間を宣言するために使用されます。の。次に、index.php を実行してエラーが見つかりませんでした。index.php を変更してメソッド呼び出しテストを実行します

index.php

<?php
require_once("a.php");
require_once("b.php");
$a1 = new demo1\a\Test\Test();
$a1->ceshi();
ログイン後にコピー

次に、index.php を実行します。 .php ファイル

D:\phpStudy\WWW\demo\demo1\a.php

3.

例 3

さあ、たとえば、a.php で Test クラスを複数回インスタンス化する必要がある場合、毎回完全な名前空間情報を記述するのが面倒な場合はどうすればよいでしょうか。例:

<?php
require_once("a.php");
require_once("b.php");
$a1 = new demo1\a\Test\Test();
$a2 = new demo1\a\Test\Test();
$a1->ceshi();echo '
'; $a2->ceshi();
ログイン後にコピー
エラーは出ませんが、面倒です。毎回完全な名前空間名を記述する必要があります。エラーは報告されず、ctrl c、ctrl v を使用できますが、あまり綺麗ではありません(^_^)。

これを行うことができます

index.php

<?php
require_once("a.php");
require_once("b.php");
use demo1\a\Test\Test;
$a1 = new Test();
$a2 = new Test();
$a1->ceshi();
echo '
'; $a2->ceshi();
ログイン後にコピー

use キーワードはクラスを導入するために使用され、名前空間によって表されます。クラスが使用されます。後で操作を直接インスタンス化できます

4. 例 5

次に、次のような別の質問が再び発生します。

index.php

<?php
require_once("a.php");
require_once("b.php");
use demo1\a\Test\Test;
use demo1\b\Test\Test;
$a = new Test();
$b = new Test();
$a->ceshi();
echo '
'; $b->ceshi();
ログイン後にコピー

ここで、index.php ファイルを実行します

## 致命的なエラー: デモ 1\b\Test\Test をテストとして使用できません。 name は D:\phpStudy\WWW\demo\demo1\index.php の

5

行ですでに使用されています。名前空間は使用されていますが、 2 つのクラスは同じ名前で、両方とも Test です。プログラムは、2 番目の Test クラスが b.php の Test クラスであることを認識しません。このとき、as キーワード # を使用します。 ##index .php

<?php
require_once("a.php");
require_once("b.php");
use demo1\a\Test\Test;
use demo1\b\Test\Test as bTest;
$a = new Test();$b = new bTest();
$a->ceshi();echo '
'; $b->ceshi();
ログイン後にコピー
as キーワードはクラス名の別名を定義します。これにより、同じクラス名との競合を効果的に防ぐことができます

5.

例 6

たとえば、a.php と同じレベルにグローバル クラス ファイルを作成します。 c.php:

c.php

<?php
class Test{    
public function ceshi(){        
echo __FILE__;
    }
}
ログイン後にコピー

在index.php文件中这样做即可调用c.php中的test方法

<?php
require_once("a.php");
require_once("b.php");
require_once("c.php");
use demo1\a\Test\Test;
use demo1\b\Test\Test as bTest;
$a = new Test();$a->ceshi();
echo '
'; $b = new bTest(); $b->ceshi(); echo '
'; $c = new \Test(); $c->ceshi(); echo '
';
ログイン後にコピー

我们将这种类叫做全局类,如果要使用需要类前面加入反斜杠”\” 

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

关于PHP多态的理解

PHP文件编程的介绍

以上がPHP 名前空間の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート