名前空間クラスのファイルに名前を付けるにはどうすればよいですか?


9

WP Core Handbook> PHPコーディング標準>命名規則では、クラスを使用してファイルに名前を付ける場合、次のことを推奨しています。

クラスファイル名は、クラス名のclass- 前に付加し、クラス名の下線をハイフンに置き換えたものに基づいている必要があります。たとえば、次のようにWP_Errorなります。

class-wp-error.php

このセクションの文言から、それは主にコアでの使用を目的としてますが、コーディングスタイルは全体として一般に(そして私の意見では)サードパーティのWPコードに適用されます。

ただし、コアは名前空間をサポートしていないため(PHP 5.2、うーん)、これはそのような場合を考慮していません。

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

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

  • 名前空間を完全に無視する
  • ファイル名に名前空間を含める
  • 名前空間をフォルダレベルとして使用する
  • PSRなどの代替命名スキームを完全に使用する

3
私の正直な意見は、PHP 5.3+を使用している場合、すでにWPのコアルールに違反しているということです。さらに、WP標準はインターフェースや特性を考慮していないことを考慮してください。したがって、私にとっては、あなたにとって便利な方法を選択し、PSRのようなすでに確立されている標準を使用するのが理にかなっています。
gmazzap

回答:


7

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

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

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


4
つまり、PSR互換にする:)
kaiser

2

私はこの要件のクラスを作成しました。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などの代替命名スキームを完全に使用する

composerを使用してPSR-4オートローダーを登録する場合、WPの命名規則に近いままにすることができます。アンダースコアを含むことができるフォルダにマップされた名前空間と、アンダースコアを含むこともできるクラスのような名前のファイル。お気に入り:

<Namespace_Dir>/Class_Name.php

WPがphp 5.3+に移行すると(最終的にはそれが発生するはずですよね!)、ガイドラインを更新する必要があります。PSR-0はすでに非推奨となっているため、不要な場合はPSR-4を少なくともお勧めします。


0

pablo-sg-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"
}] 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.