I've this class
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\'');
}
}
and his child
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'));
}
}
I need another $db
object in WebController, you can note that for the moment i did duplicate code.
How i can recall the $db from parent without duplicate code? I did try
$db = parent::__construct();
without luck. Thank you
You should explicitly declare your constructor as public as a matter of good practice.
You are not overriding the constructor in the child and so the parent constructor is used.
The child inherits the parents properties which are protected.
Therefore you can use $this->db to access the database object of the parent.
You should extract creaing $db to method (createConnection) ie.:
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;
}
}
And then you can use extracted method:
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'));
}
}
Or use connection created via constructor
class WebController extends Controller {
public function login()
{
$user = new \DB\SQL\Mapper($this->db, 'users');
$auth = new \Auth($user, array('id'=>'username', 'pw'=>'password'));
}
}