使用static返回父变量

时间:2013-04-11 13:07:10

标签: php

我的数据库连接位于名为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关键字的问题,因为我没有该类的实例?

我知道父母和自我关键字。

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

提前致谢!

3 个答案:

答案 0 :(得分:2)

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

  1. 您提供有关数据库的模型知识。制作管理模型的东西,然后将其“推/刷”到数据库中。
  2. Fav :: getFavourite()在您的代码中可能看起来不错,但它没有意义。你不应该要求你的模型自行检索。
  3. 我建议你看一下现有的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
    }
    

答案 1 :(得分:0)

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

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

您现在可以通过调用self::getDatabase()->select("x");

来使用您的数据库类

暂且不说:确保要使用静态函数执行此操作。我不这样做。

答案 2 :(得分:-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')));
    }
}

无需扩展模型类。