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 关键字时遇到问题,因为我没有该类的实例?

我知道 parent 和 self 关键字。

有人可以解决这个问题并告诉我如何在这里关联正确的关键字!

提前致谢!

4

3 回答 3

2

你在这里犯了一些设计缺陷。

  1. 您提供有关数据库的模型知识。使某些东西管理您的模型,然后将其“推送/刷新”到您的数据库中。
  2. Fav::getFavourite() 在您的代码中可能看起来不错,但它没有意义。您不应该要求您的模型自行检索。

我建议您查看现有的 ORM,例如 Doctrine 或 Propel,看看它们如何解决您遇到的设计问题。

编辑:我将用于 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 回答
0

除了这看起来不像真正的可靠代码之外,您可以使用以下内容扩展您的基类:

protected static function getDatabase()
{
    return new Database(DB_TYPE, DB_HOST, DB_NAME, DB_USER, DB_PASS);
}

您现在可以通过调用来使用您的数据库类self::getDatabase()->select("x");

顺便说一句:确保你想用静态函数来做这件事。我不会这样做。

于 2013-04-11T13:13:16.070 回答
-1

在 OOPS 概念中,静态方法只能访问静态变量和方法,但 PHP 并不遵循所有 OOPS 概念。基本上,您应该遵循 Singleton 设计模式来获取数据库连接,以确保一次只初始化一个对象

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 回答