WordPressのPHPネームスペース–ナンセンスガイドなし

公開: 2018-10-16

PHPの名前空間はほぼ10年前のものです。 はい、10年が経過しました(そして、はい、あなたは年をとっています)。 PHP v5.3がリリースされてから10年が経過したにもかかわらず、多くの開発者はまだ名前空間の基本的な理解を持っていません。 正直なところ、 WordPressは名前付けを使用しないため、「 WordPressのみを使用する場合は、名前付けの使用方法を知る必要はありません」。 名前空間の忍者である必要はありませんが、基本を理解するのは簡単で、うまくいきます。

PHPの名前空間は10年前から存在していますが、#wordpressも使用しないため、まだ使用していませんか? 読んで2分で使い始めましょう! #発達

クリックしてツイート

名前空間のサポートがない場合–プレフィックスを使用します

長い間、PHPはネイティブの名前空間をサポートしていませんでした。 そのため、WordPressや他の多くの大きなコードベースはネイティブの名前付けを使用していません。 それらは必要なときに存在しなかったので、プレフィックスが使用されます。

名前空間は、関数write_to_log()が別のコードによってまだ定義されていないことを確認するために重要です。 名前が衝突しないようにするには、グローバルスコープ内のすべてにプレフィックスが必要です。これにより、関数はawesome_project_write_to_log()になり、他のすべての関数と変数もawesome_project_プレフィックスを取得します。 単純? です! 可愛い? ではない正確に。

静的メソッドのカプセル化のように、そのアプローチに代わるものがいくつかあります。 すべての関数をクラスにラップし、静的メソッドとして宣言します。 次に、 my_function()を呼び出す代わりに、 My_Class::my_function() )を呼び出します。 より良い? 少しですが、それでも適切な名前空間ではありません。

名前空間によって、複数のコードピース(または必要に応じてパッケージ)が競合することなく同じクラス名と関数名を使用できるようになる方法を見てみましょう。 または、PHPマニュアルに記載されているように、コードのカプセル化をどのように有効にするか。 ファイルやフォルダとの類似性もよくわかります。多くの点で、名前空間はフォルダと同じように動作するため、マニュアルからコピーして貼り付けます。

どのオペレーティングシステムでも、ディレクトリは関連ファイルをグループ化し、その中のファイルの名前空間として機能します。 たとえば、ファイルfoo.txtはディレクトリ/ home/gregと/home/ otherの両方に存在できますが、foo.txtの2つのコピーを同じディレクトリに共存させることはできません。 / home / gregディレクトリ外のfoo.txtファイルにアクセスするには、ディレクトリ区切り文字を使用してファイル名の前に完全なディレクトリ名を追加し、/ home / greg/foo.txtを取得する必要があります。

名前の宣言–最初の行を覚えておいてください

キーワードnamespaceは、ファイルのコードの最初の行である必要があります(コメントやPHP以外のコンテンツはカウントされません)。 名前空間は、クラス、インターフェイス、関数、および定数にのみ影響します。 それらは変数に影響を与えません。 複数のファイルに同じ名前空間を定義して、コードを複数のファイルに分割できます。 サブ名前空間では、バックスラッシュ( namespace myproject\level1\level2 )を使用して、フォルダーと同様に名前空間に階層を定義できます。 これらは基本的なものであり、名前空間を宣言するためのほとんどすべてのルールです。

// file-A.php contains a function under the myCompany\PackageA namespace
namespace myCompany\PackageA;
 
function do_something() {
  // do things
}
// file-B.php contains a function with the same name
// but under a different namespace
namespace myCompany\PackageB;
 
function do_something() {
  // do things
}

可能ですが、複数の名前空間を1つのファイルに結合しないことを強くお勧めします。 私を信じてください。遅かれ早かれ、あなたはそれをしたことを忘れてしまい、2分のバグのデバッグには2時間かかります。 ただし、必要な場合は、次の構文を使用してください。

// do not put multiple namespace declarations into the same file
// but if you must, here's the syntax

namespace MyFirstProject {
  const CONST = true;
  class Connection { /* ... */ }
  function connect() { /* ... */  }
}

namespace MySecondProject {
  const CONST = true;
  class Connection { /* ... */ }
  function connect() { /* ... */  }
}

// any code after this has to go in the global namespace
namespace {
  $some_var = 1;
  function_in_global_namespace();
}

名前名の使用–フォルダを覚えておいてください

すでに述べたように、名前空間はフォルダーと非常によく似ています。 ファイルfoo.txtが現在のフォルダーにあると仮定します。 簡単なfoo.txtで参照できます。 foo.txtファイルのあるフォルダーの1つ上のレベルにいる場合は、相対パス../foo.txtまたは絶対パス/folder1/folder2/foo.txtを使用する必要があります。 特別なことは何もありません。 名前空間は同じパラダイムを使用します。

// remember after declaring a namespace
// all our code is in it; like when you're working in a folder
namespace mycompany\project;

function foo() {}
class foo {
  static function staticmethod() {}
}

// resolves to mycompany\project\foo() because of line #3
foo();

// likewise, resolves to mycompany\project\foo::staticmethod()
foo::staticmethod();

// constant are affected by namespaces too
// so we're working with mycompany\project\FOO
echo FOO;

// this is a relative path
// resolves to mycompany\project\subnamespace\foo()
subnamespace\foo();

// static methods are no different
// mycompany\project\subnamespace\foo::staticmethod()
subnamespace\foo::staticmethod();
                                 
// a full namespace path starts with a backslash
// it resolves exactly to what it says it does
\otherNamespace\Bar\foo();

// again same thing for a constant, full path nothing magical
echo \otherNamespace\Bar\FOO;

PHPマニュアルのuseキーワードを見てください–例は素晴らしいです。 これは、他のPHP名前空間から現在の名前空間にコードをインポートしたり、エイリアスを使用して外部(完全修飾)名を参照したりする方法を提供します。

はい、名前名が必要であり、それらを使用する必要があります

WordPressのソースを見ると明らかなように、名前空間を使用する必要はありませんが、名前空間のいくつかの方法を使用する必要があります。 WPの場合はwp_で接頭辞を付けます。 それで、私たちがすでにそれをしているのなら、なぜそれをきちんとやらないのですか?

PHPの名前空間は、あらゆる開発ワークフローに簡単に統合できます。 自動読み込みやファイルの命名が簡単になり、一般的にコードがすっきりします。 古いコードのリファクタリングは(コーディング言語に関係なく)人気のあるタスクではないため、名前空間を使用していると言えるように、作業中の2MBプロジェクトをリファクタリングするように指示するつもりはありません。 ただし、新しいプロジェクトで作業するときは、名前空間を使用することをお勧めします。 すぐに感謝します。

名前付けに関する公式のPHPドキュメントは、優れたものを超えています。 コードサンプルはクリーンで、実際のコメントは役に立ちます。 必要ないと思われる場合でも、必ず閲覧してください。