1

私のデータベース接続は、Model という親クラスにあります。

インスタンスを持たないユーティリティ クラスを設計しているので、 static キーワードを使用しています。アプリケーションの関数自体にのみアクセスしたい。

class Model {

    function __construct() {
        $this->db = new Database(DB_TYPE, DB_HOST, DB_NAME, DB_USER, DB_PASS);
    }

}

これは私の親クラスです。

class Fav extends Model{

    public static function getFavourite($data){
        return $this->db->select('SELECT favouriteid FROM favourite WHERE type = :type AND linkid = :linkid 
                              AND userid = :userid', array('type' => $data['type'], 'linkid' => $data['linkid'],
                              'userid' => Session::get('userid')));
    }
}

クラスのインスタンスがないため、$this キーワードに問題がありますか?

親と自己のキーワードを知っています。

誰かがこれを解決して、ここで正しいキーワードを関連付ける方法を教えてください!

前もって感謝します!

4

3 に答える 3

2

ここでいくつかの設計上の欠陥を作っています。

  1. データベースに関するモデルの知識を与えます。モデルを管理する何かを作成し、それをデータベースに「プッシュ/フラッシュ」します。
  2. Fav::getFavourite() はあなたのコードでは良さそうに見えるかもしれませんが、意味がありません。モデルに自分自身を取得するように依頼するべきではありません。

Doctrine や Propel などの既存の ORM を調べて、設計上の問題をどのように解決したかを確認することをお勧めします。

編集: Symfony2 に使用するソリューション:

// I will have this registered under mybundle.favourites as service
class FavouritesService
{
  private $em;

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

  public function getFavourite($what, SomeUserObject $for)
  {
    // do some stuff with the manager here and retrieve my favourite.. based on $data
  }
}

// some random action in my controller
public function someAction()
{
  $favorite_car = $this->get('mybundle.favorites')->getFavourite('car', $this->get('session.user'));
  // some code
}
于 2013-04-11T13:15:56.203 に答える
-1

OOPS の概念では、静的メソッドは静的な変数とメソッドにしかアクセスできませんが、PHP はすべての OOPS の概念に従っているわけではありません。基本的に、Singleton 設計パターンに従ってデータベース接続を取得し、一度に 1 つのオブジェクトのみが初期化されるようにする必要があります。

class Model {
    public static $db;
    public static function getInstance () {
        if (!isset (self::$db))
             self::$db = new Database(DB_TYPE, DB_HOST, DB_NAME, DB_USER, DB_PASS);

        return self::$db;
    }
}

そして、以下のように使用する必要があります

class Fav
{
     public static function getFavourite($data)
     {
        return Model::getInstance()->select('SELECT favouriteid FROM favourite WHERE type = :type AND linkid = :linkid 
                              AND userid = :userid', array('type' => $data['type'], 'linkid' => $data['linkid'],
                              'userid' => Session::get('userid')));
    }
}

モデルクラスを拡張する必要はありません。

于 2013-04-11T13:17:20.087 に答える