我有一个主类和一个扩展类(数据库连接)。
父类名Classica
扩展DatabaseQ
如何在父级中调用扩展类方法?
这不起作用:
$this->connectdb();
或者这个:
$this->DatabaseQ->connectdb();
示例代码:
扩展
class DatabaseQ extends Classica{
public $dbhost;
public $dbname;
public $dbuser;
public $dbpass;
function __construct(){
include('config.php');
$this->dbhost = $dbhost;
$this->dbname = $dbname;
$this->dbuser = $dbuser;
$this->dbpass = $dbpass;
}
#connect to database
public function connectdb(){
$link = mysql_connect($this->dbhost,$this->dbuser,$this->dbpass);
if (!$link) {
die('Could not connect: ' . mysql_error());
}else {
//echo 'Connected Successfully to Database<br>';
}
@mysql_select_db($this->dbname) or die( "Unable to select database!");
}
#read database
function readdb(){
}
#update database
private function updatedb(){
}
#close database connection
function closedb(){
mysql_close();
}
}
父
class Classica{
function sample_method(){
//connect db here
//run some sql queries here
}
答案 0 :(得分:1)
使用抽象方法。并阅读有关OOP的书。
abstract class Classica {
public abstract function connectdb();
public function Test() {
$this->connectdb();
}
}
class DatabaseQ extends Classica {
public function connectdb(){
echo 'connected!';
}
}
$x = new DatabaseQ();
$x->Test(); // output: 'connected!'
答案 1 :(得分:1)
根据你们两个课程的内容来判断你完全没有理由使用Classica
课程,因为当你把它全部包裹起来时,你会不必要地将功能责任分散到几个课程上在单个班级里面。
我看到你使用“父”类的唯一原因是连接到你的数据库并做一些初始查询。除非您计划稍后实现某些高级设计模式,否则您无法在DatabaseQ构造函数中执行此操作。
class DatabaseQ {
public $dbhost;
public $dbname;
public $dbuser;
public $dbpass;
function __construct(){
include('config.php');
$this->dbhost = $dbhost;
$this->dbname = $dbname;
$this->dbuser = $dbuser;
$this->dbpass = $dbpass;
$this->connectdb(); // This is a good place to initiate your DB connection
$this->doOtherInitStuff(); // Calling the rest of the init stuff.
}
/**
* This is the place where you do all of your init stuff.
* Note the private status! The environment doesn't need to have access to your DB initialization stuff
*/
private function doOtherInitStuff() {
// Do init stuff
}
#connect to database
private function connectdb(){ // Note the private scope too! Only the object itself needs to know how to connect to the db!
$link = mysql_connect($this->dbhost,$this->dbuser,$this->dbpass);
if (!$link) {
die('Could not connect: ' . mysql_error());
}else {
//echo 'Connected Successfully to Database<br>';
}
@mysql_select_db($this->dbname) or die( "Unable to select database!");
}
#read database
function readdb(){
}
#update database
private function updatedb(){
}
#close database connection
function closedb(){
mysql_close();
}
}
另一方面,如果您打算创建一个基类,稍后将使用它来说不同的DB“drivers”(带有重载方法的扩展类),您可以创建一个抽象类,它只包含所有的蓝图。扩展(驱动程序)类需要实现的方法。
但那是一个有点高级的故事:)
编辑:如果您需要一个专门用于输出DatabaseQ检索的东西的类,那么创建一个扩展的DatabaseQ类,并将所有将吐出数据的内容放在其中。
class DatabaseQOutput extends DatabaseQ {
public function __construct(){
parent::__construct(); // You make sure here that the parents constructor is executed and a DB connection and initialization stuff is taken care off
}
public function output() {
}
}
$db = new DatabaseQOutput();
$db->output();
但是说实话,你实际上并不希望任何特定于数据库的类负责输出数据,因为这通常不是他们的工作。数据库类应该被视为模型,尽管您没有使用MVC,这意味着它们的角色主要是作为数据库和所有数据获取/发送操作的抽象层。
如果我是你,我会创建一个专门负责输出数据的类,这些数据是用数据库类检索的。这样你就可以创建一个以某种方式充当视图的类,并接受输出数据的所有责任。