PHP名前空間の詳しい使い方
名前空間の最も明確な目的の 1 つは、重複した名前の問題を解決することです。PHP では、2 つの関数またはクラスが同じ名前を持つことを許可しません。そうしないと、致命的なエラーが発生します。この場合、名前の重複を避ける限り解決できます。最も一般的な方法は、プレフィックスを合意することです。
例: プロジェクトには記事とメッセージボードの 2 つのモジュールがあり、それぞれにユーザーのコメントを処理するクラス Comment があります。後で、すべてのユーザー メッセージの情報統計関数を追加する場合があります。たとえば、すべてのメッセージの数を取得したいとします。この時点で、Comment によって提供されるメソッドを呼び出すことは良い考えですが、それぞれの Comment クラスを同時に導入することは明らかに不可能であり、コードでエラーが発生し、Comment を別の場所に書き換えるとエラーが発生します。メンテナンス性が低下します。次に、クラス名をリファクタリングするだけで、次のようにクラス名の前にモジュール名を追加するという名前付けルールに同意しました。将来的には、より多くのコード (少なくともより多くの文字) が記述される予定です。さらに、将来的に各モジュールに統合関数を追加したり、相互に呼び出したりする場合は、名前が重複した場合に名前を再構築する必要があります。もちろん、プロジェクトの開始時にこの問題に気づき、名前付けルールを指定することで、この問題は回避できます。別の解決策は、名前空間を使用することです。
注:
この記事で説明されている定数: PHP5.3 以降、const キーワードはクラスの外で使用できるようになりました。 const と define はどちらも定数の宣言に使用されます (その違いについては詳しく説明しません) が、名前空間では、define はグローバルに機能するのに対し、const は現在の空間に対して機能します。記事内で言及した定数は、const を使用して宣言された定数を指します。
基本
名前空間は、コードを異なる空間(領域)に分割します。各空間の定数、関数、クラスの名前(面倒なので、以下では要素と呼びます)は相互に影響を与えません。私たちがよく行うこと 「カプセル化」の概念について言及しました。
名前空間を作成するには、次のように namespace キーワードを使用する必要があります:
<?php//创建一个名为'Article'的命名空间namespace Article;?>
現在のスクリプト ファイルの最初の名前空間の前にコードを置くことはできないことに注意してください。次の記述は間違っています: 次のようにコードをコピーします:
//例 1
<?php$path = "/";class Comment { }namespace Article;?>
//例 2//スクリプトの前にいくつかの文字を出力します
<html></html><?php namespace Article;?>
なぜ最初のことを言うのですか? 名前空間についてはどうですか?同じスクリプト ファイル内に複数の名前空間を作成できるためです。
以下の 2 つの名前空間を作成し、これら 2 つの空間のそれぞれに Comment クラス要素を追加しました:
次のようにコードをコピーします:<?php//创建一个名为'Article'的命名空间namespace Article;//此Comment属于Article空间的元素class Comment { }//创建一个名为'MessageBoard'的命名空间namespace MessageBoard;//此Comment属于MessageBoard空间的元素class Comment { }?>
異なる空間間で他の要素を直接呼び出すことはできません。名前空間を使用する必要があります。 構文: Copyコードは次のとおりです:
<?phpnamespace Article;class Comment { }namespace MessageBoard;class Comment { }//调用当前空间(MessageBoard)的Comment类$comment = new Comment();//调用Article空间的Comment类$article_comment = new \Article\Comment();?>
メッセージボードスペースの記事スペースでCommentクラスを呼び出す際に、ファイルパスのような構文が使用されていることがわかります: スペース名 要素名
クラスに加えて、関数と定数は同じです。以下では、2 つのスペースに新しい要素を作成し、その値をメッセージボード スペースに出力します。
次のようにコードをコピーします:<?phpnamespace Article;const PATH = '/article';function getCommentTotal() { return 100; }class Comment { }namespace MessageBoard;const PATH = '/message_board';function getCommentTotal() { return 300; }class Comment { }//调用当前空间的常量、函数和类echo PATH; ///message_boardecho getCommentTotal(); //300$comment = new Comment();//调用Article空间的常量、函数和类echo \Article\PATH; ///articleecho \Article\getCommentTotal(); //100$article_comment = new \Article\Comment();?>
それから、Article スペースの要素データを取得しました。
サブスペース
ネームスペースの呼び出し構文はファイル パスに似ており、これによりサブスペースをカスタマイズして各空間間の関係を記述することができます。
申し訳ありませんが、2 つのモジュールの記事と掲示板が実際には同じブログ プロジェクト内にあることを言い忘れていました。名前空間を使用してそれらの関係を表現すると、次のようになります:
<?php//我用这样的命名空间表示处于blog下的article模块namespace Blog\Article;class Comment { }//我用这样的命名空间表示处于blog下的message board模块namespace Blog\MessageBoard;class Comment { }//调用当前空间的类$comment = new Comment();//调用Blog\Article空间的类$article_comment = new \Blog\Article\Comment();?>
さらに、サブスペースは、BlogArticleArchivesDate
パブリックスペースなど、多くのレベルを定義することもできます
common_inc.php スクリプトファイルがあります。 inside いくつかの便利な関数とクラスがあります:次のようにコードをコピーします:
<?phpfunction getIP() { }class FilterXSS { }?>
このスクリプトを名前空間に導入すると、スクリプト内の要素はこの名前空間に属しません。このスクリプトで他の名前空間が定義されていない場合、その要素は常にパブリック スペースにあります: 次のようにコードをコピーします:
<?phpnamespace Blog\Article;//引入脚本文件include './common_inc.php';$filter_XSS = new FilterXSS(); //出现致命错误:找不到Blog\Article\FilterXSS类$filter_XSS = new \FilterXSS(); //正确?>
パブリック スペースを呼び出す方法は、要素名の前に直接追加することです。それ以外の場合は、 PHP パーサーは、現在のスペースの下にある要素を呼び出したいと考えます。カスタム要素に加えて、PHP 独自の要素も含まれており、それらはすべてパブリック スペースに属します。
実際、パブリックスペースの関数と定数は追加しなくても通常通り呼び出すことができますが(なぜPHPがこれを行うのか理解できません)、要素を正しく区別するために
を追加することをお勧めします。関数を呼び出すときの名前用語
。エイリアスを設定してインポートする前に、スペースの 3 つの名前の用語と、PHP がそれらを解析する方法を理解しておく必要があります。公式ドキュメントは非常に優れているので、そのまま使用しました。
1. 非修飾名、またはプレフィックスのないクラス名 ($comment = new Comment(); など)。現在の名前空間が BlogArticle の場合、Comment は BlogArticleComment として解析されます。コメントを使用するコードに名前空間 (グローバル空間) のコードが含まれていない場合、コメントはコメントとして解析されます。
2.限定名称,或包含前缀的名称,例如 $comment = new Article\Comment();。如果当前的命名空间是Blog,则Comment会被解析为Blog\Article\Comment。如果使用Comment的代码不包含在任何命名空间中的代码(全局空间中),则Comment会被解析为Comment。
3.完全限定名称,或包含了全局前缀操作符的名称,例如 $comment = new \Article\Comment();。在这种情况下,Comment总是被解析为代码中的文字名(literal name)Article\Comment。
其实可以把这三种名称类比为文件名(例如 comment.php)、相对路径名(例如 ./article/comment.php)、绝对路径名(例如 /blog/article/comment.php),这样可能会更容易理解。
我用了几个示例来表示它们:
复制代码代码如下:
<?php//创建空间Blognamespace Blog;class Comment { }//非限定名称,表示当前Blog空间//这个调用将被解析成 Blog\Comment();$blog_comment = new Comment();//限定名称,表示相对于Blog空间//这个调用将被解析成 Blog\Article\Comment();$article_comment = new Article\Comment(); //类前面没有反斜杆\//完全限定名称,表示绝对于Blog空间//这个调用将被解析成 Blog\Comment();$article_comment = new \Blog\Comment(); //类前面有反斜杆\//完全限定名称,表示绝对于Blog空间//这个调用将被解析成 Blog\Article\Comment();$article_comment = new \Blog\Article\Comment(); //类前面有反斜杆\//创建Blog的子空间Articlenamespace Blog\Article;class Comment { }?>
其实之前我就一直在使用非限定名称和完全限定名称,现在它们终于可以叫出它们的名称了。
别名和导入
别名和导入可以看作是调用命名空间元素的一种快捷方式。PHP并不支持导入函数或常量。
它们都是通过使用use操作符来实现:
复制代码代码如下:
<?phpnamespace Blog\Article;class Comment { }//创建一个BBS空间(我有打算开个论坛)namespace BBS;//导入一个命名空间use Blog\Article;//导入命名空间后可使用限定名称调用元素$article_comment = new Article\Comment();//为命名空间使用别名use Blog\Article as Arte;//使用别名代替空间名$article_comment = new Arte\Comment();//导入一个类use Blog\Article\Comment;//导入类后可使用非限定名称调用元素$article_comment = new Comment();//为类使用别名use Blog\Article\Comment as Comt;//使用别名代替空间名$article_comment = new Comt();?>
我注意到,如果导入元素的时候,当前空间有相同的名字元素将会怎样?显然结果会发生致命错误。
例:
复制代码代码如下:
<?phpnamespace Blog\Article;class Comment { }namespace BBS;class Comment { }Class Comt { }//导入一个类use Blog\Article\Comment;$article_comment = new Comment(); //与当前空间的Comment发生冲突,程序产生致命错误//为类使用别名use Blog\Article\Comment as Comt;$article_comment = new Comt(); //与当前空间的Comt发生冲突,程序产生致命错误?>
动态调用
PHP提供了namespace关键字和NAMESPACE魔法常量动态的访问元素,NAMESPACE可以通过组合字符串的形式来动态访问:
复制代码代码如下:
<?phpnamespace Blog\Article;const PATH = '/Blog/article';class Comment { }//namespace关键字表示当前空间echo namespace\PATH; ///Blog/article$comment = new namespace\Comment();//魔法常量__NAMESPACE__的值是当前空间名称echo __NAMESPACE__; //Blog\Article//可以组合成字符串并调用$comment_class_name = __NAMESPACE__ . '\Comment';$comment = new $comment_class_name();?>
字符串形式调用问题
上面的动态调用的例子中,我们看到了字符串形式的动态调用方式,如果要使用这种方式要注意两个问题。
使用双引号的时候特殊字符可能被转义
复制代码代码如下:
<?phpnamespace Blog\Article;class name { }//我是想调用Blog\Article\name$class_name = __NAMESPACE__ . "\name"; //但是\n将被转义为换行符$name = new $class_name(); //发生致命错误?>
不会认为是限定名称
PHP在编译脚本的时候就确定了元素所在的空间,以及导入的情况。而在解析脚本时字符串形式调用只能认为是非限定名称和完全限定名称,而永远不可能是限定名称。
复制代码代码如下:
<?phpnamespace Blog;//导入Common类use Blog\Article\Common;//我想使用非限定名称调用Blog\Article\Common$common_class_name = 'Common';//实际会被当作非限定名称,也就表示当前空间的Common类,但我当前类没有创建Common类$common = new $common_class_name(); //发生致命错误:Common类不存在//我想使用限定名称调用Blog\Article\Common$common_class_name = 'Article\Common';//实际会被当作完全限定名称,也就表示Article空间下的Common类,但我下面只定义了Blog\Article空间而不是Article空间$common = new $common_class_name(); //发生致命错误:Article\Common类不存在namespace Blog\Article;class Common { }?>
总结
我对PHP的命名空间刚刚接触,也不能随便给一些没有实践的建议。我个人认为命名空间的作用和功能都很强大,如果要写插件或者通用库的时候再也不用担心重名问题。不过如果项目进行到一定程度,要通过增加命名空间去解决重名问题,我觉得工作量不会比重构名字少。也不得不承认它的语法会对项目增加一定的复杂度,因此从项目一开始的时候就应该很好的规划它,并制定一个命名规范。
相关推荐:
以上がPHP名前空間の詳しい使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

CakePHP はオープンソースの MVC フレームワークです。これにより、アプリケーションの開発、展開、保守がはるかに簡単になります。 CakePHP には、最も一般的なタスクの過負荷を軽減するためのライブラリが多数あります。

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。
