7

私はPHPのOOPへの移行に取り組んでいます。私はphp.netで説明を読んでいますが、ここでいくつかの具体的な答えが得られることを望んでいました。

質問を説明するために、次の例を作成しようとしました。「Database」、「Products」、および「Users」クラスがあり、ユーザーがアクセスできる場合に製品を表示したいとします。

そこで、「Products」クラスを「showProducts()」関数と呼びます。これにより、「User」クラスのインスタンスが作成され、「Database」オブジェクトのインスタンスが作成され、ユーザーのアクセスレベルがチェックされます。

ユーザーがアクセス権を持っている場合、「showProducts()」関数は「Database」オブジェクトの別のインスタンスを作成し、データベースにクエリを実行します。

class Database{

   public function query(){ 
      //runs query here 
   }

   public function __construct() { 
      //sets up connection here 
   }

}

class User{

   public function checkAccess(){ 
      $db = new Database(); 
      $db->query( //pass in query to check access )
      //does stuff, then returns true or false
   }

}

class Products{

   public function showProducts(){

      $user = new User();

      if($user->checkAccess())
         $db = new Database(); 
         $db->query( //pass in query to get products )
      }

}

私は誰かがこれを適切な方法で行う方法を説明できることを望んでいました。

「Database」オブジェクトの複数のインスタンスを作成しなくても、アクセスする必要のあるすべてのクラスで使用できる1つの「Database」オブジェクトを作成するある種のコントローラークラスが必要です。usersクラスでも同じことをしたいので、「User」クラスで何かを使用する必要があるたびに新しいオブジェクトを作成しなくても、すべてのクラスがアクセスできる1つの$usersオブジェクトがあります。

ご不明な点がございましたら、お詫び申し上げますとともに、ご回答ありがとうございました!!

返信ありがとうございます!

4

3 に答える 3

12

フォーム手続き型をオブジェクト指向プログラミングに移行するときは、クラスの構築方法だけでなく、それ以上のことを理解する必要があります。OOPはクラスを作成していません。それは、OOPのベストプラクティス、原則、およびパターンに従うことについてです。

別のオブジェクト内で新しいオブジェクトをインスタンス化するのではなく、コンストラクターまたはセッターメソッドを介して、ユーザーオブジェクト、ユーザーが依存するデータベースオブジェクトを指定する必要があります。それは依存性注入と呼ばれます。目標は、コンストラクターまたはセッターメソッドを介してオブジェクトを必要とするクラスにオブジェクトを提供することです。また、クラスの構成が簡単になるように、そのクラスの外部からインスタンス化する必要があります。また、クラスを作成するときは、そのクラスがどのような依存関係を持っているかを簡単に確認できるようにする必要があります。制御の反転の原理については、ここで読むことができます:IoC

したがって、コードは次のようになります。

<?php

// User object that depends on Database object, and expects it in constructor.

class User
{
    protected $database;

    public function __construct($database)
    {
        $this->database = $database;
    }

    // -- SNIP --
}

?>

次に、そのユーザークラスを使用するには、次のようにします。

<?php

    $database = new Database($connParams);
    $user = new User($database);

?>

セッターメソッドを使用して依存性注入を使用して依存関係を設定することもできますが、Ilではそれを自分でグーグルできます:)

それだけです。制御原理の反転について、そして依存性注入と依存性注入コンテナについて読んでください。これらはクラスを管理するための最良の方法です。

私は「OOP」である多くのPHPコードを見てきましたが、実際にはそれらは機能の名前空間としてクラスのみを使用しています:)だから、OOPの原則とパターンについて学ぶだけです。

楽しむ!:)

于 2012-10-09T19:56:39.680 に答える
2

コンストラクターやその他のメソッド内でオブジェクトをインスタンス化しないでください。それらをパラメータとして、できればファクトリと呼ばれる別のクラス内で渡します。これにより、コードのテストが簡単になるだけでなく、オブジェクトの作成も簡単になります。

また、シングルトンを使用しようとしないでください。これは「グローバル変数」のオブジェクト指向バージョンであり、グローバル変数を使用する必要はありません。それはあなたのコードのテストを本当に難しくし、ほとんど不可能にします。

このビデオhttp://www.youtube.com/watch?v=-FRm3VPhseIを見て、シングルトンを使用するのが悪い理由を理解してください。特に19:00のCreditCardの例は一見の価値があります。

本当に最先端のことをしたいのなら、「依存性注入」の概念を見てください。基本的に、外部から必要なものをクラスに渡すことは完全な秘密ですが、これを自動的に行うフレームワークがあるため、ファクトリを自分で作成する必要はありません。これらは「依存性注入コンテナ」または「DIC」と呼ばれます。

于 2012-10-09T19:42:26.343 に答える
0

すべてのコードに対して1つのオブジェクトを作成するには、シングルトンパターンを使用します。

class Database{
   private $db_descriptor;

   private function __construct(){
       /* connect and other stuff */
   }
   public static function getInstance(){
       static $instance;
       if($instance === null){
          $instance = new self();
       }
       return $instance;
   }
}

また、ユーザーにも同じ手法を使用できます。php5.4では、シングルトンパターンに1つの特性を使用できます。最後のヒント:データベースやその他の重いものを扱うときは、レイジー初期化と呼ばれる手法を使用します。OOPスキルを向上させるときは、Doctrine Projectを見て、そのテクニックをよく使用します。

于 2012-10-09T19:40:16.483 に答える