2014-01-14 9 views
1

config.phpPHP класс наследует родительский вопрос

<?php 
define('DB_HOST', 'localhost'); 
define('DB_DB', 'db'); 
define('DB_USERNAME', 'root'); 
define('DB_PASSWORD', '123456'); 

class.main.php

<?php 
class main { 
    var $host  = ''; 
    var $db  = ''; 
    var $username = ''; 
    var $password = ''; 
    var $conn = ''; 

    public function __construct() { 
     $this->host = DB_HOST; 
     $this->db = DB_DB; 
     $this->username = DB_USERNAME; 
     $this->password = DB_PASSWORD; 
    } 

    /** 
    * Connect to database 
    */ 
    function connect() { 
     $this->conn = mysql_connect($this->host, $this->username, $this->password) or trigger_error(mysql_error(), E_USER_ERROR); 
     mysql_query("SET NAMES 'utf8'"); 
    } 

    public function myRow($sql) { 
     mysql_select_db($this->db, $this->conn); 
     $rec = mysql_query($sql, $this->conn) or die(mysql_error()); 
     $row = mysql_fetch_assoc($rec); 
     $count = mysql_num_fields($rec); 

     if ($this->recordCount > 0) { 
      $result = array(); 
      $temp = array(); 

      do { 
       for ($i = 0; $i < $count; $i++) { 
        $name = mysql_field_name($rec, $i); 
        $temp[$name] = $row[$name]; 
       } 

       array_push($result, $temp); 
      } while($row = mysql_fetch_assoc($rec)); 
     } else { 
      $result = NULL; 
     } 

     mysql_free_result($rec); 
     return $result; 
    } 
} 

Это часть моего класса, если я хочу, чтобы получить данные, это как

<?php 
include 'config.php'; 
include 'class.main.php'; 
$main = new main; 
$main->connect(); 
$sql = 'SELECT * FROM table'; 
$row = $main->myRow($sql); 

Иногда я делаю другой класс для разных случаев, некоторые из классов, возможно, должны использовать функцию myRow, вот как я это сделал сейчас.

class.sub.php

<?php 
class sub extends main { 

    public function __construct() { 
     parent::__construct(); 
    } 

    /** 
    * Get member information 
    * 
    * @param integer $id member id 
    * @return data 
    */ 
    public function member($id = NULL) { 
     $this->connect(); 

     if (NULL === $id) { 
      $id = $_SESSION['memberId']; 
     } 

     $sql = "SELECT * 
      FROM `members` 
      WHERE `on` = 1"; 
     return $this->myRow($sql); 
    } 
} 

<?php 
include 'config.php'; 
include 'class.main.php'; 
$main = new main; 
include 'class.sub.php'; 
$sub = new sub; 
$main->connect(); 

$sql = 'SELECT * FROM table'; 
$row = $main->myRow($sql); 

$member = $sub->member(); 
echo $member['xxx']; 

Это работа прямо сейчас, все, что я обеспокоен, я называю $ this-> соединить в member функции снова в противном случае я не могу получить соединение из основного класса, но означает, что я дважды подключаюсь к базе данных на одной странице, такой ресурс теряется, как его исправить?

+0

У вас есть два решения. Сделайте dbclass как singleton или расширьте все классы из класса db. Также вы хотели бы переместить вызов соединения в конструктор класса db и прекратить вызов соединения извне. Вы просто делаете sql-запросы и обрабатываете соединение внутри dbclass. На самом деле я не думаю, что это необходимо, но так оно и есть. – makallio85

+0

Синглтон - ключевое решение здесь. – makallio85

+0

Прошу прощения, не могли бы вы показать мне простые образцы :) – Chan

ответ

1

Чтобы решить эту проблему, вы должны прочитать «Design Patter». Специально «Singleton Pattern». Обычно этот шаблон используется, когда мы делаем такие классы.

Basic есть, в этой модели,

Мы можем иметь только один объект этого класса в целом приложения одновременно.

Прочтите это простой и очень четкий пример. http://kazymjir.com/blog/singleton-pattern-php-example-tutorial/

+0

Singleton для логики базы данных это потрясающе, спасает много неприятностей. это отладка устройства: p –

0

Попробуйте добавить var $conn = NULL; в родительский класс.

Это явно объявляет его как общедоступную переменную и может быть унаследовано.

+0

У меня действительно было это, просто забыл добавить, извините за это , проблема заключается в том, как подкласс класса получает результат функции 'connect', если я уже вызываю его до – Chan

+0

@ 吳承 諺 Либо поместите переменную на уровень класса (сделайте ее статичной и вызовите с помощью' :: '), либо используйте' mysql_ * 'без предоставления «соединение», поскольку оно будет использовать последнее соединение, если оно не предусмотрено. – msg7086

+0

Я бы хотел, но иногда странно бывает без добавления строки подключения – Chan

Смежные вопросы