DevTips –PHPの名前空間
公開: 2020-03-06約1年前、WordPressは必要な最小PHPバージョンを5.2(2010年以降使用)からより最新のものに更新することを決定しました。 実際、今日、WordPressが推奨するPHPの最小バージョンは、最新のPHP7.3の1つです。
単純なWordPressユーザーの場合、これはおそらくあまり影響を与えません(これらの新しいバージョンがより良いパフォーマンスを提供するという事実を超えて)。
しかし、開発者の場合、これらの新しいPHPバージョンには、プラグインやテーマで使用できるすばらしい機能がいくつかあります。 そして今日、具体的には、長い間私たちと一緒にいたものについてお話ししたいと思いますが、名前空間です。
WordPressとコードプレフィックス
WordPress開発者として最初に学ぶルールの1つは、「名前の衝突」を回避するために「私たちが行うすべてのことにプレフィックスを使用する」ことです。 WordPressのベストプラクティスで読むことができるように:
プラグインが別のプラグインと同じ名前を変数、関数、またはクラスに使用している場合、名前の衝突が発生します。
[名前の衝突を避けるために]、すべての変数、関数、およびクラスには、一意の識別子をプレフィックスとして付ける必要があります。 プレフィックスは、他のプラグインが変数を上書きしたり、誤って関数やクラスを呼び出したりするのを防ぎます。 それはまたあなたが同じことをするのを妨げるでしょう。
WordPressプラグインを開発するためのベストプラクティス
したがって、たとえば、 get_site_idのような関数を作成する代わりに、 nelio_content_get_site_idという名前を付けることをお勧めします。 このようにして、特定の関数( get_site_id )が属するプラグイン( nelio_content )またはテーマをすばやく識別し、複数のプラグインが同じ関数を定義しようとした場合の致命的なエラーを回避できます。
プレフィックスの使用は、「名前空間」を作成するための基本的な方法です。 より良い代替手段がなかったときに実装しなければならなかった回避策。 同じプレフィックスを使用するすべての要素は、同じセットまたは名前空間の一部です。 ただし、これにより、コードが不必要に複雑になります。名前空間をエミュレートする以外の目的を果たさないプレフィックスがあるため、名前が長くなります。
PHP名前空間
PHPバージョン5.3では、名前空間の概念が導入されました。 彼らがドキュメントでそれを与えている定義は私には素晴らしいように思われるので、ここでそれを再現します:
最も広い定義では、名前空間はアイテムをカプセル化する方法です。 これは、多くの場所で抽象的な概念と見なすことができます。 たとえば、どのオペレーティングシステムでも、ディレクトリは関連ファイルをグループ化し、その中のファイルの名前空間として機能します。 具体的な例として、ファイルfoo.txtはディレクトリ/ home/gregと/home/ otherの両方に存在できますが、 foo.txtの2つのコピーを同じディレクトリに共存させることはできません。
PHPの世界では、名前空間は、ライブラリやアプリケーションの作成者がクラスや関数などの再利用可能なコード要素を作成するときに遭遇する2つの問題を解決するように設計されています。
1.作成したコードと内部PHPコードまたはサードパーティコードとの間の名前の衝突。
2. Extra_Long_Namesをエイリアス(または短縮)する機能。ソースコードの読みやすさを向上させます。
PHPドキュメント
名前空間を作成する方法
PHPで名前空間を作成するのは非常に簡単です。 作成するPHPファイルの先頭に、使用するnamespaceディレクティブを追加します。そのファイルで定義する「すべて」は、その名前空間に属します。
<?php namespace Nelio_Content; はい、それはとても簡単です! これで、作成する「すべて」がNelio_Content名前空間になります。 たとえば、最初に述べたような関数を定義すると、次のようになります。
<?php namespace Nelio_Content; function get_site_id() { // ... } get_site_idがNelio_Content名前空間内にあることがわかりました。 このようにして、関数を定義するときにnelio_content_プレフィックスを使用する必要がなくなりました。 すごい!
名前空間の例外
これまでに説明した内容をよく見ると、「すべて」を引用符で囲んでいることがわかります。「そこに追加する「すべて」は、指定された名前空間に属します。」 なぜ私はそれをしたのですか? 名前空間は、私たちが作成するすべてのコードに完全に適用されるわけではないため、いくつかの例外があります。
PHP名前空間は、次のPHP要素のみをカバーします。
- クラス
- インターフェース
- 特性
- 関数
constで宣言されているが、defineでは宣言されていない定数
さらに、WordPressには独自の名前空間が必要なものがいくつかありますが、残念ながらPHPの名前空間はカバーしていません。スクリプトハンドル、データベースオプション、カスタムコンテンツタイプとそのメタデータなどです。これらすべての場合、プレフィックスを引き続き使用します。

ある名前空間から別の名前空間に要素をインポートする方法
独自の名前空間にある要素を使用する必要がある場合は、特別なことをする必要はありません。名前で呼び出すだけです。 たとえば、次のコードスニペットでは次のようになります。
<?php namespace Nelio_Content; function get_site_id() { // ... } function get_auth_token() { $site_id = get_site_id(); // ... } Nelio_Content名前空間内にget_site_idとget_auth_tokenの2つの関数が定義されていることがわかります。 get_auth_tokenがget_site_idを使用する必要がある場合は、通常どおり呼び出します。
一方、別の名前空間でget_site_idを使用する必要がある場合は、完全な識別子を使用して関数を呼び出す必要があります。
<?php namespace Something_Else; function do_some_action() { $site_id = Nelio_Content\get_site_id(); // ... } または、キーワードuse:をuseして関数をインポートする必要があります。
<?php namespace Something_Else; use Nelio_Content\get_site_id; function do_some_action() { $site_id = get_site_id(); // ... } 私は個人的に2番目のオプションが大好きです。キーワードuse useして他の名前空間から関数をインポートすると、ファイルのヘッダーをざっと見て、その依存関係を特定できます。
PHP名前空間を使用したWordPressフィルターとアクション
WordPressのフィルターとアクションの横にある名前空間を使用する際に留意すべき重要な詳細があります。 フィルタとアクションのコールバックを指定する場合、通常はコールバック名を文字列として指定します。
<?php // ... add_action( 'init', 'do_some_action' );問題は、この関数が名前空間内にある場合、前のフックが期待どおりに機能しないことです。 関数のフルネームをWordPressに伝える必要があります。 つまり、名前空間を含める必要があります(名前空間がある場合)。
名前空間自体を定義するファイルにフックを追加していますか? 関係ありません。フルネームを使用してください。
<?php namespace Nelio_Content; function do_some_action() { // ... } add_action( 'init', 'Nelio_Content\do_some_action' ); 別の名前空間にいますが、関数をuseしてインポートしましたか? どちらも問題ではありません。フルネームを使用してください。
<?php namespace Something_Else; use Nelio_Content\do_some_action; // ... add_action( 'init', 'Nelio_Content\do_some_action' );名前空間でのエイリアスの使用
名前空間のもう1つの非常に興味深い機能は、エイリアシングです。 次のシナリオを想像してみてください。
<?php namespace Nelio_Content; function get_site_id() { // ... } この関数を別の名前空間で使用したい場合は、useを使用してuseできることをすでに確認しています。 しかし、使用したいモジュールにget_site_idという関数が既にある場合、この関数をどのように使用しますか?
幸いなことに、インポートを新しい名前にエイリアスすることができます。
<?php namespace Something_Else; use Nelio_Content\get_site_id as get_nc_site_id(); function get_site_id() { // ... } function do_some_action() { $nc_site_idd = get_nc_site_id(); // ... }今日から名前空間の使用を開始してください!
名前空間は、名前の衝突を回避し、コードを整理するための素晴らしいツールです。 実際、この投稿についてはコメントしていませんが、使用する名前空間の構造やコードをディレクトリやファイルに編成する方法に基づいてPHPがクラスを自動ロードできるようにするPSR-4などの標準があります。
プロジェクトでまだ名前空間を使用していない場合は、これから使用を開始することをお勧めします。 コメントであなたの経験について教えてください!
UnsplashのChaitanyaTvsによる注目の画像。
