web-dev-qa-db-ja.com

名前空間付きクラスのファイルに名前を付ける方法は?

WPコアハンドブック> PHPコーディング規約>命名規則 クラスでファイルに命名するために以下を提案します:

クラスファイル名は、クラス名の先頭にclass-を付け、クラス名のアンダースコアをハイフンに置き換えたものにします。例えば、WP_Errorは次のようになります。

class-wp-error.php

セクションの文言からは主に core useを意図していますが、全体的なコーディングスタイルは一般的にサードパーティのWPコードにも当てはまります。

しかし、coreは名前空間をサポートしていないので(PHP 5.2、ugh)、これはそのような場合を説明していません。

開発者の利便性の観点からそれを実現するための実用的な方法は何ですか?オートローダのサポートは?

私は複数の代替方法を見ることができました:

  • 名前空間をすべて無視する
  • ファイル名に名前空間を含める
  • フォルダレベルとして名前空間を使う
  • pSRなどの代替命名規則を完全に使用する
8
Rarst

まず、class-プレフィックスを無視します。これは、WordPressの純粋な手続き型コードアプローチによるもので、クラスは実際のオブジェクトではなく手続き型コードのコンテナとして使用され、ほとんどのファイルにはクラスがまったく含まれていません。すべてのファイルに含まれるクラスが1つだけで、それ以外のクラスが含まれていない場合は意味がありません。
そのパターンに従う場合は、interface-foo.phpおよびtrait-bar.phpを使用する必要があります。それはばかげて見えるだけでなく、必要以上に自動読み込みを難しくします。

名前空間とクラス/インターフェイス/特性名を分離する最も簡単な方法は、(私の経験では)名前空間をディレクトリ名に、クラス名をファイル名に割り当てることです。これにより、要求されたクラスをオートローダーの特定のファイル構造に簡単にマップできます。\/に変換し、.phpを追加して、ファイルをロードするだけです。

これにより、ルックアップのキャッシュも簡単になります。すべてのディレクトリ/名前空間について、そのディレクトリが最初に要求されたときにすべての既存のファイルを取得でき、後の呼び出しでは、file_exists() everyを要求せずにファイル名のリストを再利用できます時間。

6
fuxia

私はPSR-4と互換性のあるWordpressのコーディング標準と互換性のあるこの要求のためのクラスを作りました。

あなたはここでそれに達することができます: https://github.com/pablo-pacheco/wp-namespace-autoloader

説明はすべてですが、基本的には作曲家の依存関係です。あなたのプロジェクトでそれを要求するだけです:

"require": {    
    "pablo-pacheco/wp-namespace-autoloader": "dev-master"
}

それからクラスを呼び出します

<?php
new \WP_Namespace_Autoloader( array(    
    'directory'   => __DIR__,       // Directory of your project. It can be your theme or plugin. __DIR__ is probably your best bet.    
    'namespace'   => __NAMESPACE__, // Main namespace of your project. E.g My_Project\Admin\Tests should be My_Project. Probably if you just pass the constant __NAMESPACE__ it should work     
    'classes_dir' => 'src',         // (optional). It is where your namespaced classes are located inside your project. If your classes are in the root level, leave this empty. If they are located on 'src' folder, write 'src' here 
) );
1

私は一般的にあなたのオプションの後半に行きます:

  • フォルダレベルとして名前空間を使う
  • pSRなどの代替命名規則を完全に使用する

PSR-4オートローダを登録するためにcomposerを使用する場合は、WP命名規則に忠実に従うことができます。アンダースコアを含むことができるクラスのような名前のファイルでアンダースコアを含むことができるフォルダにマップされた名前空間。好きです:

<Namespace_Dir>/Class_Name.php

WPがphp 5.3以降に移行したら(やがてそうなるでしょう?)、ガイドラインを更新する必要があります。 PSR-0はすでに廃止されているので、PSR-4は必要でなければ少なくとも推奨されるべきです。

1
cfoellmann

pablo-s-g-pachecoの解決策は私にとってはうまくいきました。オートロードは作曲家に頼っていますが、WordPressのコーディング標準と互換性がありますが、GithubリポジトリのURLは:

https://github.com/pablo-sg-pacheco/wp-namespace-autoloader

パッケージ名は次のとおりです。

"require": {    
    "pablo-sg-pacheco/wp-namespace-autoloader": "dev-master"
}

最後に、パッケージはpackagistには含まれていないので、composer.jsonに以下を追加する必要があります。

"repositories": [{
    "type": "vcs",
    "url": "https://github.com/pablo-sg-pacheco/wp-namespace-autoloader"
}] 
0