接頭辞を超えて:PHP名前空間へのWordPress開発者ガイド
公開: 2019-11-12すべてにプレフィックスを付けます。
それはWordPressソフトウェア自体として古い格言です。 プレフィックスはWordPress開発者にとって長い間標準であったため、何か別のことをすることを想像するのは難しいです。 しかし、何か新しいことをする時が来ました。 まあ、それはかなり遅れていますが、WordPressはより大きなPHPの世界での標準的な慣行に少し遅れています。
プレフィックスとは、プロジェクト名のコードに適したバージョンを作成し、それをグローバル名前空間内の関数、クラス、およびその他のものの前に貼り付けることです。 たとえば、get_post()の代わりに関数tavern_get_post() get_post()名前を付けて、致命的なエラーが発生する関数名の衝突を回避します。
接頭辞は「名前空間」の1つの形式であり、このスペースの名前が特定のプロジェクトに属していることを示すための空想的な方法です。 ただし、プレフィックス(およびあまり一般的ではないサフィックス)は、PHP言語のソリューションが存在しなかった時代からのハックです。
PHP 5.3は名前空間の公式な方法を導入したので、この標準は何年も前から存在しています。 WordPress 5.2はPHPの最小要件を5.6に引き上げたため、開発者は古い習慣を捨てて、PHPの世界に追いつく時が来ました。
名前空間(ほぼ)すべて
PHPの名前空間は、次の項目のみを対象としています。
- クラス
- インターフェース
- 特性
- 機能
constキーワードで宣言されているが、define()ではない定数
スクリプトハンドル、画像サイズ名、データベースオプション、およびグローバル名前空間内の他の項目に関しては、引き続きプレフィックスを付ける必要があります。 これらはIDであり、PHP名前空間の範囲外です。
名前空間を作成する方法
名前空間は簡単に宣言できます。 特定の名前空間を使用するPHPファイルの先頭で、次のコードスニペットに示すように宣言します。
<?php 名前空間居酒屋;
このコード行は、この特定のファイル内のすべてがTavernの名前空間を持っていることを宣言します。
Hello, World!を出力するための、その名前空間の下にある単純な関数を見てください。 メッセージ。
<?php
名前空間居酒屋;
関数hello(){
_e( 'Hello、World!'、 'example-textdomain');
} プレフィックスの古いルールに従っている場合、 hello()はtavern_hello()という名前になります。 ただし、名前空間の場合はそうではありません。 hello()関数はTavern名前空間内にカプセル化されており、 hello()という名前の他の関数と競合しません。
クラスとインターフェースは関数と同じように機能します。 クラス名がArticleの場合、クラスファイルは次のようになります。
<?php
名前空間居酒屋;
クラス記事{
//..。
}注:ファイルごとに1つのクラスまたはインターフェースのみが存在する必要があります。 これは、オートローダーの使用を計画している場合に特に重要です。
名前空間に名前を付ける方法
開発者は物事に名前を付ける方法について議論するのが好きで、万能の解決策はありません。 最も重要なルールは、他のプロジェクトのコードとの衝突を避けるために一意であるということです。 これを行うための最良の方法の1つは、 Packageサブ名前空間でトップレベルのVendor名前空間を使用することです。
ベンダーの名前空間がTavernであり、問題のプロジェクトがNewsという名前のWordPressテーマであったとします。 プロジェクトの名前空間は次のようになります。
<?php 名前空間Tavern \ News;
これは、一部の開発者にとっては少し冗長かもしれません。 プロジェクトの名前が「Awesomesauce」のようにすでにかなり一意である場合は、単に次を使用することをお勧めします。
<?php 名前空間Awesomesauce;
少なくとも、自分自身のために、ある種の標準的な規則を考え出す必要があります。 最終的には、自動読み込みのようなものに取り掛かりたいと思うでしょう。そのため、すべてのプロジェクトで従うシステムがあると役立ちます。 PHP-FIGオートローダー標準を自由に読んでください。
クラスと関数を別の名前空間にインポートする
現在の名前空間とは異なる名前空間のクラスまたは関数を使用する必要がある場合は、それをインポートする必要があります。 これは、PHPのuseキーワードを介して行われます。
useステートメントは、 namespace宣言の後に指定する必要があります。 また、完全修飾クラス名を参照する必要があります。 次のコードは、 Tavern\Helpers\Postクラスを別の名前空間のファイルにインポートします。

<?php 名前空間Tavern \ Template; Tavern \ Helpers \ Postを使用します;
インポートしたら、次のスニペットに示すように、 Postクラスを直接使用しても安全です。
$ post = new Post();
PHP 5.6以降では、 use functionとuse constキーワードをそれぞれ使用して、他の名前空間から関数と定数をインポートすることもできます。 次のコードブロックは、関数と定数の両方をインポートする方法を示しています。
<?php 名前空間Tavern \ Template; 関数Tavern \ Helpers \ func_nameを使用します; const Tavern \ Helpers \ CONSTANT_NAMEを使用します;
クラスと関数のエイリアシング
最終的には、現在の名前空間内のクラスまたは関数と同じ名前のクラスまたは関数をインポートする必要がある状況に遭遇します。 これが名前空間が解決することを意図した問題であるとあなたは考えているかもしれません。 幸い、PHPには、インポート時にエイリアスを作成する方法が用意されています。
Tavern\Userという名前のクラスがあり、 Tavern\Contracts\Userインターフェイスを実装する必要があるとします。 インターフェイスをインポートするときは、以下に示すようにエイリアスを作成する必要があります。
<?php
名前空間居酒屋;
Tavern \ Contracts \ UserをUserContractとして使用します。
クラスUserはUserContract {を実装します
//..。
} useステートメントの最後に追加さas UserContractは、 Userインターフェイスのエイリアスを作成します。 新しいUserContract名をエラーなしで安全に使用できます。
クラス、インターフェイス、関数、および定数はすべて、エイリアスを作成するための同じメソッドに従います。
名前空間に基づいてフォルダ構造を整理する
名前空間とプロジェクトのファイルおよびフォルダー構造を一致させることは、より広いPHPの世界では標準的な方法です。 これを行うと、他の開発者がプロジェクト内のコードを簡単に見つけることができます。 また、オンデマンドでクラスをロードするためのオートローダーの構築も簡単になります。
通常、すべてのPHPコードは、プロジェクト内の/src 、 /inc 、または同様の名前のフォルダーに配置する必要があります。 プラグインファイルとフォルダの構造の例は、次のようになります。
/ plugin-name
/ src
/芯
/Activate.php
/Setup.php
/意見
/Post.php
/Page.php 名前空間を使用して同じ構造に従う場合、上記の.phpファイルには次のクラスが含まれます。
-
Tavern\Core\Activate -
Tavern\Core\Setup -
Tavern\View\Post -
Tavern\View\Page
ファイル名とフォルダー名では大文字と小文字が区別され、名前空間とクラス名と完全に一致する必要があることに注意してください。
もちろん、あなたはあなたが望むどんな慣習にも自由に従うことができます。 ただし、前述の推奨事項は適切な方法であり、長期的にプロジェクトを編成する方法を簡素化します。
名前空間を使用する利点
最も明白な利点は、同じ名前のクラスと関数の間の衝突を回避することです。 プレフィックスを使用したのと同じ理由で、実際の名前空間を使用する必要があります。
名前空間は、長いクラス名を避けるのに役立ちます。 大規模なプロジェクト全体で長い名前を入力するのは、せいぜい退屈な作業です。
インポートすることで、実装をより簡単に切り替えることができます。 他の名前空間からクラスとインターフェースをインポートするコツをつかんだら、1行のコードでインターフェースの実装を切り替えることができます。
少なくともトップレベルの名前空間を必要とするPSR-4:Autoloader標準に従うと、クラスの自動ロードがはるかに簡単になります。
プロフェッショナル分野の開発者は、WordPressエコシステムを超えた市場性のあるスキルを身に付けることができます。 名前空間の使用方法がわからない場合、PHP開発作業を見つけるのは難しいでしょう。 理解するのは難しい概念ではありませんが、実際には学習曲線が存在する場合があります。
