質問
include を使用するメリットとデメリットについて参考にしたいです ファイルとオブジェクト (クラス) PHP アプリケーションを開発するとき。
この答えを見つけるための場所が 1 つあると有益であることはわかっています...私自身の意見がいくつかありますが、他の人の意見を聞くのを楽しみにしています。
簡単な例:
私のサイトの特定のページには、ログインしたユーザーのみがアクセスできます。実装には 2 つのオプションがあります (他にもありますが、これら 2 つに限定しましょう)
authenticate.php ファイルを作成し、すべてのページに含めます。認証用のロジックが保持されます。
認証機能を持つユーザーオブジェクトを作成し、各ページで認証用のオブジェクトを参照します。
編集どちらかの利点を比較検討する方法を知りたいと思っています。私の現在の(そして弱い理由)は次のとおりです。
含まれるもの - 関数を呼び出すのが簡単/短くなる/高速になる場合があります オブジェクト - 機能とプロパティのグループ化により、長期的なメンテナンスが可能になります。
含まれるもの - 書くコードが少なくなります (コンストラクターやクラス構文がありません) 怠惰だと言われがちですが、これは本当です。
オブジェクト - 機能と創造に対する形式と単一のアプローチを強制します。
含まれるもの - 初心者でも扱いやすい オブジェクト - 初心者には難しいですが、専門家には嫌われます。
私はプロジェクトの開始時にこれらの要素を検討して、インクルードを行うかオブジェクトを行うかを決定します。これらは私の頭の中にあるいくつかの長所と短所です。
解決
これらは実際には反対の選択ではありません。とにかくチェックコードを含める必要があります。あなたの質問は、手続き型プログラミングと○○プログラミング。
PHP3 または PHP4 では、数行のコードまたは関数を記述し、それをページ ヘッダーに含めるという方法で行われていました。それは簡単です、それはうまくいきます(それが私たちがやった方法です) osコマース, 、eコマース PHP アプリケーションなど)。
しかし、多くの開発者が認めているように、保守と変更は簡単ではありません。
PHP5 では、独自のデータと認証メソッドを保持するユーザー オブジェクトを作成します。ユーザーと認証に関係するすべてが 1 か所に集中されるため、コードがより明確になり、保守が容易になります。
他のヒント
この質問はいくつかの非常に議論の余地のある問題 (OOP、ユーザー認証) に触れていますが、それらと __autoload に関する 2 番目の Konrad のコメントは省略します。C/C++ を知っている人なら誰でも、ファイルを含めることがどれほど面倒であるかを知っています。PHP5 の追加機能である autoload を使用すると、OOP を使用することを選択した場合 (私はほぼ独占的に使用しています)、標準的なファイル命名規則を使用し、ファイルごとに 1 つのクラスを制限する (推奨します) だけで済み、残りは PHP が自動的に実行します。コードがクリーンアップされるので、不要になったインクルードを削除し忘れることを心配する必要がなくなります (インクルードに関する多くの問題の 1 つ)。
現在の仕事で PHP を使用していますが、私は PHP の経験があまりありません。一般に、大規模なシステムでは、OO が提供する読みやすさと理解しやすさの恩恵を受けることがわかります。ただし、一貫性 (OO と非 OO を混在させない) や個人的な好み (ただし、実際には個人のプロジェクトに限る) なども重要です。
決して使わないことを学びました include
私が使用するコアライブラリ内と中央の1つを除いて、PHPで include
これらのライブラリ (+ config) をアプリケーションに含めます。それ以外はすべてグローバルによって処理されます __autoload
必要なさまざまなクラスを認識するように構成できるハンドラー。これは、クラスの適切な命名規則を使用して簡単に行うことができます。
これは柔軟性があるだけでなく、非常に効率的であり、アーキテクチャをクリーンに保ちます。
もう少し具体的に教えていただけますか?あなたが示した例では、両方の方法で include を使用する必要があります。ケース 1 ではファイルのみを含めますが、ケース 2 では、User クラスのインスタンス化を可能にするためにクラス ファイル (たとえば user.class.php) を含める必要があります。
アプリケーションの残りの部分がどのように構築されるかによって異なりますが、それは OO ですか?○○を使ってください。
クラス内で行う場合でも、より手続き型のスタイルで行う場合でも、次のことを確認するだけで済みます。
- セッションがあります。
- セッションが有効であること。そして、
- セッションを所有しているユーザーが適切な権限を持っていること。
3 つのステップすべてを 1 つの関数にカプセル化できます (または、Session クラスの静的メソッドが機能する場合もあります)。これを試して:
class Session
{
const GUEST = 0;
const SUBSCRIBER = 1;
const ADMINISTRATOR = 2;
public static function Type()
{
session_start();
// Depending on how you use sessions on
// your site, you might just check for the
// existence of PHPSESSID. If you track
// every visitor with sessions, however, you
// might want to assign some separate unique
// number (that you can track in a DB) to
// authenticated sessions
if(!$_SESSION['uniqid'])
{
return Session::GUEST;
}
else
{
// For the best security, don't store the
// user's access permissions in the $_SESSION,
// but rather check against the DB. This will
// ensure that recently deleted or downgraded
// administrators will not be able to make use
// of a previous session.
return THE_ACCESS_LEVEL_ACCORDING_TO_THE_DB
}
}
}
// In your files that need to check for authentication (you
// could also do this in a controller if you're going MVC
if(!(Session::Type() == Session::ADMINISTRATOR))
{
// Redirect them to wherever you want them to go instead,
// like a log in page or something like that.
}