Вызов проблемы метода расширенного класса - PullRequest
0 голосов
/ 03 августа 2011

У меня есть основной и расширенный класс (соединения с базой данных).

Имя родительского класса Classica
Extended DatabaseQ

Как можно вызывать методы расширенного класса вparent?

Это не работает:

$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
        }

Ответы [ 2 ]

1 голос
/ 03 августа 2011

Судя по содержанию обоих ваших классов, у вас нет абсолютно никаких оснований вообще использовать класс 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();    
    }

}

С другой стороны, если вы намереваетесь создать базовый класс, который будетпозже, скажем, для использования различных «драйверов» БД (расширенные классы с перегруженными методами), вы можете создать абстрактный класс, который будет содержать чертеж только для всех методов, которые должны быть реализованы вашими расширенными (драйверными) классами.

Но это немного сложная история:)

РЕДАКТИРОВАТЬ: Если вам нужен класс, который будет специально использоваться для вывода материала, который 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, а это означает, что их роль в первую очередь заключается в том, чтобы служить уровнем абстракции для баз данных и всех операций выборки / отправки данных.

На вашем месте я бы создал класскоторая специально предназначена для вывода данных, которые извлекаются из ваших классов базы данных.Таким образом, вы создадите класс, который будет действовать как представление и будет нести всю ответственность за вывод данных.

1 голос
/ 03 августа 2011

Используйте абстрактные методы. И почитай книгу по ООП.

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!'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...