2012-12-12 37 views
0

我有这个方法适用范围:

class Database{  
    private $name = ''; 
    private $user = ''; 
    private $password = ''; 
    private $host = 'localhost'; 
    private $prefix = ''; 
    private $connection_handle = null; 

    private function Connect(){ 
     $this->connection_handle = mysql_connect($this->host, $this->user, $this->password); 

     if(!$this->connection_handle){ 
      die('Could not connect: ' . mysql_error()); 
     }else{ 
      mysql_select_db($this->name, $this->connection_handle); 
     } 
    } 

    private function Close(){ 
     mysql_close($this->connection_handle); 
    } 

    public static function Query($query){ 
     $this->Connect(); 
      $result = mysql_query($query, $this->connection_handle); 
      if(!$result){ 
       die('Error: ' . mysql_error()); 
      }else{ 
       $DatabaseQuery = new DatabaseQuery(); 
        $DatabaseQuery->result = $result;  
        $DatabaseQuery->mysql_num_rows = mysql_num_rows($result); 

       return $DatabaseQuery; 
      } 
     $this->Close(); 
    } 
} 

我已经查询静态的,因为它会被称为像“数据库查询:: “ 其他功能不需要被任何其他类访问,所以我把它们设置为私有...

从Query函数访问Connect函数时出现此错误。

“使用$这个时候不是在对象上下文”

转念一想私人使得私有这一类,但可在其内的所有方法的变量,我有越来越的职能范围内的问题.. 。

我可以做自己::连接(),但我真的不明白这足以保证它的使用...

你能解释一下自我之间的区别::和%这个 - >

我也不能访问我的私有变量,他们真的永远不需要在这个类之外访问,我再次让它们成为私有的,因为这...然而$ this-> connection_handle没有变量的范围。

我真的需要让它们全部公开吗?必须有办法让它们仅适用于这个类,并且它的扩展吗?

----------------------编辑:///

我已经结束了让我所有的变量私有静态。 这是一个可以接受的方式吗?

----------------------编辑:///

现在我已经得到这个代码:

class Database{  
    private static $name = ''; 
    private static $user = ''; 
    private static $password = ''; 
    private static $host = 'localhost'; 
    private static $prefix = ''; 
    private static $connection_handle = null; 

    private static function Connect(){ 
     self::$connection_handle = mysql_connect(self::$host, self::$user, self::$password); 

     if(!self::$connection_handle){ 
      die('Could not connect: ' . mysql_error()); 
     }else{ 
      mysql_select_db(self::$name, self::$connection_handle); 
     } 
    } 

    private static function Close(){ 
     mysql_close(self::$connection_handle); 
    } 

    public static function Query($query){ 
     self::Connect(); 
      $result = mysql_query($query, self::$connection_handle); 
      if(!$result){ 
       die('Error: ' . mysql_error()); 
      }else{ 
       $DatabaseQuery = new DatabaseQuery(); 
        $DatabaseQuery->$result = $result;  
        $DatabaseQuery->$mysql_num_rows = mysql_num_rows($result); 

       return &$DatabaseQuery; 
      } 
     self::Close(); 
    } 
} 

但是返回指针引用不起作用?实际上,我并没有像PHP指针那么熟悉,任何人都会对我在这里做错的事情有所了解?

这是因为我声明函数内的DatabaseQuery类的新实例不是它。 HELPPP :)

编辑:: ///////

我已经完成了我的类,它看起来像这样:

class DatabaseQuery{ 
    public $result; 
    public $mysql_num_rows;   
} 

class Database{  
    private static $name = ''; 
    private static $user = ''; 
    private static $password = ''; 
    private static $host = 'localhost'; 
    private static $prefix = ''; 
    private static $connection_handle = null; 

    protected function Connect(){ 
     self::$connection_handle = mysql_connect(self::$host, self::$user, self::$password); 

     if(!self::$connection_handle){ 
      die('Could not connect: ' . mysql_error()); 
     }else{ 
      mysql_select_db(self::$name, self::$connection_handle); 
     } 
    } 

    protected function Close(){ 
     mysql_close(self::$connection_handle); 
    } 

    public static function FetchQueries(&$queries){ 
     $db_query = array(); 
      self::Connect(); 
       foreach($queries as $key => $query){ 
        $result = mysql_query($query, self::$connection_handle); 
        if(!$result){ 
         die('Error: ' . mysql_error()); 
        }else{ 
         $DatabaseQuery = new DatabaseQuery(); 
          $DatabaseQuery->result = $result;  
          $DatabaseQuery->mysql_num_rows = mysql_num_rows($result); 
          $db_query[ $key ] = $DatabaseQuery; 
        } 
       } 
      self::Close(); 
     return $db_query; 
    } 
} 

现在,你可以把它在模型 - 视图 - 控制(MVC)的方式,因为你是在顶部定义(或者在一个单独的文件)

$queries = array(
    "bottoms" => "SELECT * FROM bottoms", 
    "users" => "SELECT * FROM users"   
);    
$dbr = Database::FetchQueries($queries); 


//display some users 
while($row = mysql_fetch_object($dbr["apps"]->result)){ 
    echo $row->title; 
}  

//display some bottoms 
while($row = mysql_fetch_object($dbr["bottoms"]->result)){ 
    echo $row->title; 
} 

你能告诉我你觉得这个MVC方法的所有数据?

+0

有关更灵活的代码和示例,请参阅:http://stackoverflow.com/a/11580420/367456 - 也考虑直接使用PDO或Mysqli,它们将预制对象已经可以免去整个代码。 – hakre

回答

2

你应该让你的Database类可实例化。现在,你正在为每个查询打开一个新的连接,这有一个糟糕的表现(非常糟糕)。你可以让这个类成为单例(实际上通常是这样做的,因为通常只有一个连接到数据库是有意义的)。

所以你的代码(非常简化的)应该是这样的:

class Database 
{ 
    private static $instance; 

    protected function __construct() { 
    self::$instance = mysql_connect(...); 
    // do some error checking! 
    } 

    protected function __clone() {} 

    public static function getInstance() { 
    if (!isset(self::$instance)) { 
     self::$instance = new Database(); 
    } 
    return self::$instance; 
    } 

    public function query($sql) { 
    do mysql_query(...) and error checking, return $result or your own DatabaseQuery() 
    } 
} 

这样你就不能直接使查询调用静态函数,但你可以使用这个类里面的另一个功能添加:

public static function makeQuery($sql) { 
    $db = self::getInstance(); 
    return $db->query($sql); 
} 

要使用这个类的实例,你应该叫$db = Database::getInstance();,和$ DB是一个数据库对象,你可以调用它的公共方法正常。如果您只想继续进行静态调用以进行查询,请致电$result = Database::makeQuery($sql)。无论哪种方式,它都可以保证你只有一个连接到数据库(这就是单例),所以你没有为每个查询启动一个新连接的当前开销。

ALSO考虑使用mysqlipdo-mysql代替老弃用mysql_*功能(见的mysql_connect顶部的警告)。有关每个API的更多信息和优势,请参阅Choosing a MySQL API

+0

是否与私有静态一样受到保护? – Jimmyt1988

+0

我打算让$ query查询一组可以在页面开头执行的查询,以便尝试和维护MVC类型的布局。 – Jimmyt1988

+0

我在文章中添加了一个新的编辑,我真的很感谢你看看你的想法吗?你能看到我可能遇到的任何问题吗? – Jimmyt1988