我有这个:
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变为静态,因为它将像“Database :: Query”一样被调用 任何其他类都不需要访问其他函数,所以我将它们设为私有......
从Query函数访问Connect函数时出现此错误。
“不在对象上下文中时使用$ this”
思考私有使这些变量对这个类是私有的,但是对于其中的所有方法都可用,我遇到了获取函数范围的问题......
我可以做自己的:: Connect()但我真的不太了解它以保证使用它......
你能解释一下self ::和%this->
之间的区别我也无法访问我的私有变量,他们真的永远不需要在这个类之外访问,我再次将它们设为私有...而且$ 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:)
EDIT :: ///////
我已完成课程,看起来像这样:
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 :(得分:2)
您应该使Database
类可以实例化。现在,您正在为每个查询打开一个新连接,这具有极差的性能(非常糟糕)。你可以使这个类成为一个单独的(实际上通常是这样做的,因为通常只有一个与DB的连接是有意义的。)
所以你的代码(非常简化)应该是:
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是一个Database对象,您可以正常调用它的公共方法。如果您只想继续进行静态调用以进行查询,只需致电$result = Database::makeQuery($sql)
即可。无论哪种方式,都保证您只有一个与数据库的连接(这就是单例的作用),因此您没有为每个查询启动新连接的当前开销。
ALSO 考虑使用mysqli
或pdo-mysql
代替旧的和已弃用的 mysql_*
功能(请参阅顶部的警告mysql_connect
)。有关每个API的更多信息和优势,请参阅Choosing a MySQL API