我是这堂课
class Controller {
protected $f3;
protected $db;
function __construct()
{
$f3=Base::instance();
$db=new \DB\SQL('mysql:host=62.xxx;port=3306;dbname=Sqlxxx','xxxx','xxxxx');
$this->f3=$f3;
$this->db=$db;
$this->db->exec('SET CHARACTER SET utf8');
$this->db->exec('SET time_zone = \'+00:00\'');
}
}
和他的孩子
class WebController extends Controller {
public function login()
{
$db=new \DB\SQL('mysql:host=62.xxx;port=3306;dbname=Sqlxxx','xxxx','xxxxx');
$user = new \DB\SQL\Mapper($db, 'users');
$auth = new \Auth($user, array('id'=>'username', 'pw'=>'password'));
}
}
我需要在WebController中使用另一个$db
对象,你可以注意到目前我做了重复的代码。
如何在没有重复代码的情况下从父级调用$ db?我确实试过了
$db = parent::__construct();
没有运气。谢谢
答案 0 :(得分:1)
你应该提取creaing $ db到方法(createConnection),即:。
class Controller {
protected $f3;
protected $db;
function __construct()
{
$this->f3=Base::instance();
$this->db=$this->createConnection();
}
protected function createConnection() {
$db = new \DB\SQL('mysql:host=62.xxx;port=3306;dbname=Sqlxxx','xxxx','xxxxx');
$db->exec('SET CHARACTER SET utf8');
$db->exec('SET time_zone = \'+00:00\'');
return $db;
}
}
然后你可以使用提取的方法:
class WebController extends Controller {
public function login()
{
$db=$this->createConnection();
$user = new \DB\SQL\Mapper($db, 'users');
$auth = new \Auth($user, array('id'=>'username', 'pw'=>'password'));
}
}
或使用通过构造函数
创建的连接class WebController extends Controller {
public function login()
{
$user = new \DB\SQL\Mapper($this->db, 'users');
$auth = new \Auth($user, array('id'=>'username', 'pw'=>'password'));
}
}
答案 1 :(得分:1)
你应该明确地将你的构造函数声明为公开的。
您没有覆盖子项中的构造函数,因此使用了父构造函数。
子进程继承受保护的父属性。
因此,您可以使用$ this-> db来访问父级的数据库对象。