新時代PHP:ネーミングスペース

6165 ワード

前言
ネーミングスペースは新しいものではありません.PHP 5です.3.0以降に存在します.かつてc#を学んだときにネーミングスペースという概念に触れたことがありますが、phpも現れたことに気づきました.しかし、当時は記号がネーミングスペースを使うのは醜いと思っていました.ずっと興味を持っていませんでしたが、今は符がますますきれいになって、人の目はいつも進歩していると思います.
ネーミングスペースは新時代のPHPの不可欠な一部であり、現代の主流phpフレームワークの礎である.
ネーミングスペースとは
はっきり言って、ネーミングスペースはファイル、関数、クラス、定数などの重名の問題を解決して、それはオペレーティングシステムの中のファイルシステムのディレクトリ構造を仮想化して、PHPコンポーネントとフレームワークのグローバル唯一を保証します.
例えばaディレクトリの下にdbがあります.phpは、bディレクトリの下にもdbがある.php.では、古い方法では、クラス名の保持とファイルの一致によって区別されているに違いない.
たとえば、aディレクトリの名前は次のとおりです.
class A_DB{}

bディレクトリの名前は次のとおりです.
class B_DB{}

関数を記述するたびにfunction_を追加することができます.existの判断は、重複するかどうかを定義します.定数の定義は同じで、すべて衝突を解決する方案があることができて、しかし今composerが盛んで、PHP生態環境は極めて良くて、各種のコンポーネントが次々と現れて、私達はすべてのコンポーネントの命名がすべて異なっていることを保証することができなくて、しかもこのようなファイル名とクラス名を通じて区別するのは非常に優雅ではありませんて、もしディレクトリの階層がとても深いならば、クラス名は非常に冗長になるかもしれません.明らかに、私たちはもっと先進的な方法を選ぶべきだ.
ネームスペースの宣言
各phpファイルの最初のネーミングスペースはphpの上部に宣言され、namespaceで宣言され、スペースに追加され、ネーミングスペースの名前に追加され、最後に使用されます.記号の末尾.
たとえば、Aという名前のネーミングスペースを宣言します.

このネーミング空間の後ろにあるすべてのphpクラス、関数、インタフェース、定数はこのAネーミング空間の中にあります.
同じファイルに複数のネーミングスペースを定義
まずappディレクトリを作成します.
mkdir app

ネーミングスペースは、namespaceによって宣言され、useキーワードによって導入される.a.phpの作成
namespace A;

const NUM = 1;
function output()
{
    echo "A output
"; } namespace A2; const NUM = 2; function output(){ echo "A2 output
"; } // use use A; use A2; echo "NUM from A:" . A\NUM . "
"; echo "NUM from A2:" . A2\NUM . "
"; A\output(); A2\output();

実行結果は次のとおりです.
NUM from A:1
NUM from A2:2
A output
A2 output

2つのネーミングスペースを定義しました.それぞれAとA 2です.この2つのネーミングスペースの下には定数NUM、関数outputがあります.はい、ネーミングスペースが有効かどうかをテストするためにわざと同じ名前に名前を付けました.このとき,useを介して導入すると,ANUMはAネーミング空間でのNUMに基づいて1に等しく,同理A 2NUMは2に等しく,output関数もAoutput(),A 2output()によってそれぞれの関数を見つけ,それぞれの内容を出力することができる.
私たちは初めてネーミング空間を味わって、namespaceでネーミング空間を定義して、useでネーミング空間を導入して、 \ \ を通じて呼び出します.
注意:ネーミングスペースの定義はファイル名、さらにはディレクトリ構造とは何の関係もありません.例えば、ここのnamespace Aは完全にnamespace Appleに変えることができ、何の関係もありません.呼び出しが正しい限りです.
同じ書類で上記の書き方を推奨しないことを宣言し、括弧で包むことを提案します.以下のようにします.
";
}
}

namespace A2 {
const NUM = 2;
function output(){
    echo "A2 output
"; } } namespace { use A; use A2; echo "NUM from A:" . A\NUM . "
"; echo "NUM from A2:" . A2\NUM . "
"; A\output(); A2\output(); }

以上のコード出力の結果は上記と同じで、この書き方がより良いです.
phpでは、1つのphpファイルで複数のネーミングスペースを定義できますが、「1つのファイルでクラスを定義する」という良い実践に反しています.1つのファイルはクラスを定義し、1つのネーミングスペースだけを宣言します.これにより、より明確で簡潔になります.
2つのファイルでネーミングスペースを使用する
a.phpを作成するには:

b.phpを作成するには:
";
    }
}

include "a.php";//    a.php,    a.php      
echo "NUM from namespace A:" . A\NUM . "
"; echo "NUM from namespace B:" . NUM . "
"; $aObject = new A\DB(); $aObject-?>output(); $bObject = new DB(); $bObject->output();

次にb.phpファイルを実行し、次のように出力します.
NUM from namespace A:1
NUM from namespace B:2
DB from A
DB from B

今回は関数を用いず,クラスによって実践し,クラスがネーミング空間でも有効であることを証明した.定数は多くありませんが、出力は正常です.ここでは同名のDBクラスを定義していますが、衝突はなく、それぞれの内容を出力しています.
なぜ$bObject = new DB();を呼び出すのかというと、なぜ$bObject = new B\DB();を書く必要がないのかという質問があります.前になぜ号でなくても呼び出すことができますか.私たちが実行しているのはb.phpファイルです.現在のコードはBというネーミングスペースに属しているので、デフォルトでは追加されています.
私たちは番号を付けて、次のようにエラーを報告することができます.
PHP Fatal error: Uncaught Error: Class 'B\B\DB' not found in b.php
したがって、現在のネーミングスペースにBを追加する必要はありません.
グローバルスペース
名前空間が定義されていない場合、すべてのクラスと関数の定義はグローバル空間にあります.名前の前に接頭辞を付けるグローバルスペースの名前であることを示します.
comonを作成します.php
";
}

a.phpの作成

a.phpを実行し、結果:
test from a.php
test from common.php

実はphp公式は冒頭の記号の呼び出しを完全限定名と呼んでいますが、実際にはcommonが導入されているなど、現在全体的に有効な役割を果たしています.php、中にtest()が入っているので、test()で呼び出すべきです.もちろんこれは重名の下での呼び出しであり、commonのtestをtest 2と呼ぶと、直接test 2()にすることができる.呼び出しは、Aというネーミングスペースの下で競合していない関数名である必要があります.
注:グローバルクラス、関数、定数にアクセスするには、strlen()またはExceptionまたはINI_などの完全修飾名を使用します.ALL.
例:
";
echo strlen($str) . "
";

出力結果:
3
4

現在のa.phpファイルではstrlenとシステム関数strlenが重複していることは明らかです.私たちはstrlen($str)を通じてシステムの関数を呼び出します.strlen($str)はネーミングスペースAを呼び出す関数ですが、その内部はシステム関数strlenによって実現されています.
ネームスペースのインポートとエイリアス
実際のプロジェクトで遭遇するネーミングスペースの階層は、次のように深くなります.
go();

このHttpResponsePostToolは長いので、asキーで別名を定義できます.
go();

これは優雅かどうかが多い.
マルチインポート
良い実践はphpファイルでネーミングスペースの宣言をすることですが、これは複数のネーミングスペースのインポートを妨げるものではなく、よく使われています.
phpでは、useを1回のみ使用できます.カンマでネーミングスペースを分割してインポートし、最後のネーミングスペースにセミコロンを追加します.たとえば、次のようにします.

しかし、このように書くことをお勧めしません.読むのに不利です.各行でuseを使用して導入したほうがいいです.

以上を知ることで,基本的にネーミングスペースを用いて開発が可能となる.