11

PHP アプリケーションを開発する際に、インクルードファイルとオブジェクト (クラス)を使用することの長所と短所についてのリファレンスが必要です。

この回答を 1 か所にまとめておくと便利だと思います...私自身の意見がいくつかありますが、他の意見を聞くのを楽しみにしています。

簡単な例:

私のサイトの特定のページは、ログインしたユーザーのみがアクセスできます。実装には2つのオプションがあります(他にもありますが、これら2つに限定しましょう)

  1. authenticate.php ファイルを作成し、すべてのページに含めます。認証のロジックを保持します。

  2. 認証機能を持つユーザー オブジェクトを作成し、すべてのページで認証のためにオブジェクトを参照します。

編集 ある方法のメリットを他の方法よりも比較検討したいと思います。私の現在の(そして弱い理由)は次のとおりです。

インクルード - 関数を呼び出す方が簡単/短い/速い場合があります オブジェクト - 機能とプロパティのグループ化により、長期的なメンテナンスが必要になります。

インクルード- 書くコードが少ない (コンストラクターもクラス構文もない) 私は怠け者と呼ばれますが、これは本当です。

オブジェクト- 機能と作成に対する形式と単一のアプローチを強制します。

含まれている - 初心者が扱いやすいオブジェクト - 初心者にとっては難しいが、専門家には眉をひそめられます。

プロジェクトの開始時にこれらの要因を調べて、インクルードを行うかオブジェクトを行うかを決定します。これらは、私の頭の上にあるいくつかの長所と短所です。

4

6 に答える 6

13

これらは実際には反対の選択ではありません。とにかくチェックコードを含める必要があります。私はあなたの質問を手続き型プログラミング対オブジェクト指向プログラミングとして読みました。

数行のコードまたは関数を記述し、それをページヘッダーに含めることは、PHP3またはPHP4で行われた方法でした。シンプルで機能します(これが、eコマースPHPアプリケーションなどのosCommerceで行った方法です)。

しかし、多くの開発者が確認できるように、保守と変更は簡単ではありません。

PHP5では、認証用の独自のデータとメソッドを保持するユーザーオブジェクトを記述します。ユーザーと認証に関係するすべてのものが1つの場所に集中するため、コードはより明確で保守しやすくなります。

于 2008-08-22T14:57:46.547 に答える
5

質問はいくつかの非常に議論の余地のある問題(OOP、ユーザー認証)に触れていますが、それらと__autoloadに関する2番目のKonradのコメントはスキップします。C / C ++を知っている人なら誰でも、ファイルを含めてどれほどの苦痛があり得るかを知っています。PHP5の追加であるautoloadを使用すると、OOP(ほぼ独占的に使用します)を使用する場合は、標準のファイル命名規則を使用するだけで、ファイルごとに1つのクラスを制限するだけで、残りはPHPが自動的に行います。コードをクリーンアップすると、不要になったインクルード(インクルードに関する多くの問題の1つ)を削除することを覚えておく必要がなくなります。

于 2008-08-22T15:03:56.203 に答える
1

私が使用するコア ライブラリ内と、アプリケーション内のこれらのライブラリの中心 (+ 構成) のinclude1 つを除いて、PHP で決して使用しないことを学びました。include他のすべては、__autoload必要なさまざまなクラスを認識するように構成できるグローバル ハンドラーによって処理されます。これは、クラスの適切な命名規則を使用して簡単に実行できます。

これは柔軟性があるだけでなく、非常に効率的であり、アーキテクチャをクリーンに保ちます。

于 2008-08-22T14:49:13.900 に答える
1

現在の仕事で使用していますが、PHP の経験はあまりありません。一般に、大規模なシステムは、OO が提供する読みやすさと理解のしやすさから恩恵を受けることがわかりました。ただし、一貫性 (OO と非 OO を混在させないでください) や個人的な好み (ただし、実際には個人的なプロジェクトの場合のみ) なども重要です。

于 2008-08-22T14:43:22.913 に答える
0

クラスで行う場合でも、より手続き的なスタイルで行う場合でも、次のことを確認するだけで済みます。

  1. セッションがあります。
  2. セッションが有効であること。と、
  3. セッションを所有しているユーザーが適切な権限を持っていること。

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.
}
于 2008-08-22T14:56:08.127 に答える
0

もう少し具体的に教えていただけますか?あなたが与える例では、両方の方法で include を使用する必要があります。ケース 1 ではファイルのみをインクルードします。ケース 2 では、User クラスのインスタンス化を可能にするためにクラス ファイル (たとえば、user.class.php) をインクルードする必要があります。

アプリケーションの残りの部分がどのように構築されているかによりますが、OO ですか? OO を使用します。

于 2008-08-22T14:46:03.250 に答える