В настоящее время я разрабатываю два класса для взаимодействия с базой данных MySQL – один расширяет другую. Вот они:
class DB_MySQL { protected $dbuser; protected $dbpass; protected $dbhost; protected $dbname; protected $dbh; // Database connection handle public function __construct($dbuser, $dbpass, $dbhost, $dbname) { $this->dbuser = $dbuser; $this->dbpass = $$dbpass; $this->dbhost = $dbhost; $this->dbname = $dbname; } //Used to create connections - almost always called by execute() protected function connect() { try { $this->dbh = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass); } catch(PDOException $e) { print "Error!: ".$e->getMessage()."<br/>"; die(); } }
И класс ребенка:
class CheckOut extends DB_MySQL{ function __construct() { parent::__construct(); } }
Я только начал писать их, так что пока нет «мяса». Если кто-либо видит какие-либо серьезные проблемы или какие-либо предложения, не стесняйтесь указать на это.
Мой вопрос, однако, в том, как дочерний конструктор будет взаимодействовать с родителями. Мой план состоит в том, чтобы просто создать объект CheckOut без инициации родительского элемента. Как видно, мой родительский конструктор принимает четыре значения. Итак, нужно ли переопределять эти значения в дочернем конструкторе? Чтобы быть ясным, я имею в виду:
class CheckOut extends DB_MySQL{ function __construct($dbuser, $dbpass, $dbhost, $dbname) { parent::__construct($dbuser, $dbpass, $dbhost, $dbname); } }
и, конечно, определить эти переменные. Или я могу добавить эти значения при создании объекта, и он будет неявно передан?
Любая помощь приветствуется.
Если конструктор дочернего класса не выполняет никаких других действий, вы можете опустить конструктор.
Только ниже хорошо:
class CheckOut extends DB_MySQL{ }
Но если конструктору дочернего класса нужно выполнить другую работу, да, вам нужно сделать:
class CheckOut extends DB_MySQL{ public function __construct($dbuser, $dbpass, $dbhost, $dbname) { parent::__construct($dbuser, $dbpass, $dbhost, $dbname); do_some_other_work(); } }
Когда вы используете, вам нужно позвонить:
$checkout = new CheckOut($dbuser, $dbpass, $dbhost, $dbname);
Код, который вы представили в своем вопросе, является правильным способом сделать это в этом случае (предполагая, что вы хотите сделать что-то еще в конструкторе):
class CheckOut extends DB_MySQL{ function __construct($dbuser, $dbpass, $dbhost, $dbname) { parent::__construct($dbuser, $dbpass, $dbhost, $dbname); } }
В противном случае (если вы не хотите ничего делать в конструкторе), вам не нужно переопределять конструктор.
class CheckOut extends DB_MySQL{ // no constructor, Parent's constructor is called by default }