我的数据库连接位于名为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关键字的问题,因为我没有该类的实例?
我知道父母和自我关键字。
有人可以解决这个问题并告诉我如何在这里关联正确的关键字!
提前致谢!
答案 0 :(得分:2)
你在这里制造了一些设计缺陷。
我建议你看一下现有的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')));
}
}
无需扩展模型类。