2015-01-17 67 views
1

类下面是我当前的代码PHP OOP的使用扩展了功能

class Database { 
    //Connect to database here... 
} 

class User extends Database { 

    public function GetUInfo($id) { 
     $db = new Database; 
     $db->query("SELECT `id` FROM `users` WHERE `id`=:id"); 
     $db->bind(":id", $id); 
     return $db->single(); 
    } 

    public function uptime($id) { 
     $db = new Database; 
     $db->query("UPDATE `users` SET `time`=".$_SERVER['REQUEST_TIME']." WHERE `id`=:id"); 
     $db->bind(":id", $id); 
     return $db->execute(); 
    } 

} 

User类,我怎样才能让这个$db = new Database;是不是不必添加$db = new Database;在所有的公共职能做好准备,每个功能?

+0

我们可以显示数据库代码类吗?因为你已经从数据库扩展用户类 –

+0

@AnandPatel - 所以SO不会让我显示它,因为它相当大,它会使帖子多数代码。 – BryanLavinParmenter

回答

2

由于您已将Database Class扩展为User,因此您正在创建对象? 您可以直接访问数据库类的功能(公共和受保护的)

您可以使用$this关键字直接访问它。

只有你必须在构造函数(父类)和子类中建立连接,你必须调用父类的构造函数。

<?php 
class Database 
{ 
    protected $db; 

    public function __construct() 
    { 
     //your connection code 
    } 
} 

class User extends Database 
{ 

    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function GetUInfo($id) 
    { 
     $this->query("SELECT `id` FROM `users` WHERE `id`=:id"); 
     $this->bind(":id", $id); 
     return $this->single(); 
    } 

    public function uptime($id) 
    { 
     $this->query("UPDATE `users` SET `time`=".$_SERVER['REQUEST_TIME']." WHERE `id`=:id"); 
     $this->bind(":id", $id); 
     return $this->execute(); 
    } 
} 

?> 
+0

如果你想单元测试这种类型的代码,你坚持使用你的数据库。恕我直言,最好是推动用户类内的数据库依赖。不说你的方法这是一个坏事*本身*,只要记住:-) – mTorres

+0

,因为他已经扩展数据库类到用户这就是为什么;)否则我不会发布这个答案 –

+0

好点,够公平: - ) – mTorres

2

创建一个构造函数和私有财产$db

private $db; 

public function __construct() { 
    $this->db = new Database(); 
} 

所以你可以使用它像这样

public function uptime($id) { 
     $this->db->query("UPDATE `users` SET `time`=".$_SERVER['REQUEST_TIME']." WHERE `id`=:id"); 
     $this->db->bind(":id", $id); 
     return $this->db->execute(); 
    } 

由于文件档案化mTorres它能够更好地做这样的

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

如果您对OOP来说是新的 - read this article它可能有帮助。

+0

这有效,但我不知道是否有一个更容易的选项,以避免使用$ this-> db。这很好,但它可以很好地使用$ db-> – BryanLavinParmenter

+2

是的,但是你可以使依赖显式化并注入它,而不是直接创建一个新的对象:'''public __construct(DatabaseType $ db) {$ this-> db = $ db; }''' – mTorres

+0

@mTorres完全赞同你 –