PHP関数インクルードファイルの設計のヒント
-
03-07-2019 - |
質問
優れた設計では、各関数を1回だけ記述する必要があります。 PHPでは、includeコマンド(Utils.phpやAuthenticate.phpなど)とPHPコマンドinclude_onceを使用してこれを行っています。ただし、PHPインクルードファイルの標準やベストプラクティスを見つけることができませんでした。 StackOverflowで何を提案しますか?
探しているのは:
- 命名基準
- コード標準
- デザインパターン
- 一般的な関数の戻り値の型を定義するための提案 (現在、連想配列を使用しています)。
解決
使用したい規則の1つは、各クラスをClassName.class.phpという名前の独自のファイルに入れてから、オートローダーを使用してクラスファイルを含めます。または、すべてをクラス/サブディレクトリに入れて、ClassName.phpという名前を付けることもあります。私が期待しているクラスと非クラスのインクルードの数に依存します。
ユーティリティ関数をクラスに編成し、代わりに静的メソッドにすると、単一の require_once()を追加します。このアプローチは、コードまたはコーディングスタイルに適している場合とそうでない場合があります。
戻り値の型については、組み込み関数で使用される規則に従うようにしています。リクエストに適したタイプを返すか、失敗した場合にfalseを返します。確認するときは、必ず ===演算子を使用してください。結果が偽。
規約について懸念しているという事実は、あなたがすでに正しい軌道に乗っていることを示唆しています。 Java、C ++、C#などのような他のOOP言語に精通している場合は、 PHP5のOOPの良さ。
他のヒント
最終的に使用する命名規則(可能な限りJavaまたはC#からヒントを得ることを好む)は、インクルード時に実際にコードを実行しない関数のインクルードファイルを使用し、同じファイルをインクルードしないようにする二回。 ( include-once または require-once )
このような標準のいくつかはすでに書かれています。ほとんどの大規模プロジェクトは独自の標準に従います。
これはZendによって書かれたもので、Zendフレームワークで使用される標準です。 http://framework.zend.com/manual/en/coding-standard。 html
また、PEARには常にかなり厳しいコーディング標準がありました。 http://pear.php.net/manual/en/standards.php
しかし、私の好みの答えは、あなた自身のプロジェクトのために、あなたが快適に感じるものを使うべきであり、内部的に一貫しているということです。他のプロジェクトについては、そのルールに従ってください。一貫性により、コードを最大限に読みやすくできます。私自身の基準は、PEARの基準と同じではありません。 4つのスペースでインデントしません(タブを使用します)。関数名のようなキャメルケースは使用しませんが、別のプロジェクトから何かを編集する場合は、そのプロジェクトで何でも実行します。
次のことを行いました。まず、インターセプトフィルターを作成し、すべてのWeb要求をインターセプトし、コマンドラインコマンドで機能するバージョンも作成しました。
両方のインターセプターはブートストラップファイルに移動し、オートローダーをセットアップします。オートローディング機能とハッシュとしてのこのファイル。ハッシュの場合、キーはクラス名であり、値はクラスファイルへのファイルパスです。 autoload関数は単にクラス名を取得し、ファイルに対してrequireを実行します。
必要な場合のいくつかのパフォーマンスのヒント、ファイルを定義する際に一重引用符を使用します。解釈されないためわずかに高速であり、_onceバージョンの代わりにrequire / includeも使用します。 1回、前者はかなり高速です。
上記は素晴らしいことです。実際、1トンのクラスを持つ大規模なコードベースでも、ハッシュはそれほど大きくなく、パフォーマンスが問題になることはありませんでした。さらに重要なことには、私たちはいくつかのクレイジーな擬似名前空間クラスの命名規則と結婚していない。以下を参照。
他のオプションは、区切り名、擬似名前空間のトリックです。名前空間が5.3に付属するため、これは魅力的ではありません。コードベース全体で名前空間の名前を変更するのは面白くないので、これはひどいことです。とにかく、これがどのように機能するかです。すべてのコードのルートを想定してください。その後、すべてのクラスは、そこに到達するために必要なディレクトリトラバーサルに基づいて名前が付けられ、「_」などの文字で区切られ、次にクラス名自体、ファイルはクラスに基づいて名前が付けられます。このようにして、クラスの場所は名前でエンコードされ、オートローダーはそれを使用できます。 really_long_crazy_class_names_MyClass以外のこのメソッドの問題は、各呼び出しでかなりの処理が行われることですが、それは時期尚早な最適化である可能性があり、再び名前空間が来ています。
eg。
/code root
ClassA ClassA.php
/subfolder
subFolder_ClassB ClassB.php