我有一个相当大的网站,每个页面是从几个包含文件而建,我的网站是在程序的格式100%,我想学习如何使用类和PHP更加面向对象的方法。
目前我的网站被列入到每一个页面,在这个头是一个MySQL连接是由一个和最后一个页面的时间,所以如果我需要运行不同文件中的10次不同的查询头文件,他们不需要都跑做一个新的连接,所以连接只进行一次。
现在,我想转换为更OO的方式,我开始写一个mysql的类连接并运行查询,所以我想用__construct函数对MySQL的一个连接类的,我只是好奇,怎么这个会的工作,虽然,每次该类被调用它将使或尝试对MySQL,而不只是一次连接。
也许我没有想出来明确。 我是不是应该启动这个类在头1次,然后我不会有再担心?
你可以创建你的MySQL类,并使用一个全局对象,对象随处可见。 那么你的构造函数只能被调用一次。
或者你可以到处建立你的MySQL类的新对象。 的mysql_connect不打开新的连接,如果已经有一个打开的:
如果第二个电话是对mysql_connect()使用相同的参数,没有新的链接将被建立,而是已经打开的链接的链接标识将被退回。
我认为最好的方法是使用一个特殊的类来处理MySQL连接,并使用它作为一个单身。 使构造私有,并得到它返回一个现有连接或一个新的实例。
这是我的例子:
class db
{
public $host;
public $user;
public $pass;
public $database;
private static $instance = false;
private function __construct()
{
}
public static function getInstance()
{
if (self::$instance === false)
{
self::$instance = new db;
}
return self::$instance;
}
public function db_connect()
{
}
public function db_disconnect()
{
}
}
这样一来,只要您拨打:DB ::的getInstance() - > db_connect(),你一定有唯一的将是无处不在这一方面的一个实例。
是的,你不应该连接多次。 打开和关闭连接的所有时间的开销比在相对短的时间你的脚本运行保持其开放的成本更大。 所以,你应该在一开始创建类的实例,并把它放在一个全局变量。
这当然不是一个坏主意,编写自己的类的运动,但也许你应该考虑数据库连接管理中存在的解决方案之一(Zend_Db的等)。
你总是可以存储在一个静态类变量数据库链接参考,并调用它需要的时候。 然而,PHP本身尝试,如果它在内存中存在使用现有的链接。
我有一个示例数据库处理程序代码为你着,当然它的PHP 5,并使用PDO。
<?php
// Class providing generic data access functionality
class DatabaseHandler
{
// Hold an instance of the PDO class
private static $_mHandler;
// Private constructor to prevent direct creation of object
private function __construct()
{
}
// Return an initialized database handler
private static function GetHandler()
{
// Create a database connection only if one doesn’t already exist
if (!isset(self::$_mHandler))
{
// Execute code catching potential exceptions
try
{
// Create a new PDO class instance
self::$_mHandler =
new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD);
// Configure PDO to throw exceptions
self::$_mHandler->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
self::$_mHandler->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
}
catch (PDOException $e)
{
// Close the database handler and trigger an error
self::Close();
trigger_error($e->getMessage(), E_USER_ERROR);
}
}
// Return the database handler
return self::$_mHandler;
}
// Clear the PDO class instance
public static function Close()
{
self::$_mHandler = null;
}
// Wrapper method for PDO::prepare
private static function Prepare($queryString)
{
// Execute code catching potential exceptions
try
{
// Get the database handler and prepare the query
$database_handler = self::GetHandler();
$statement_handler = $database_handler->prepare($queryString);
// Return the prepared statement
return $statement_handler;
}
catch (PDOException $e)
{
// Close the database handler and trigger an error
self::Close();
trigger_error($e->getMessage(), E_USER_ERROR);
}
}
// Wrapper method for PDOStatement::execute()
public static function Execute($sqlQuery, $params = null)
{
// Try to execute an SQL query or a stored procedure
try
{
$statement_handler = self::Prepare($sqlQuery);
// Execute query
$statement_handler->execute($params);
}
// Trigger an error if an exception was thrown when executing the SQL query
catch(PDOException $e)
{
// Close the database handler and trigger an error
self::Close();
trigger_error($e->getMessage(), E_USER_ERROR);
}
}
// Wrapper method for PDOStatement::fetchAll()
public static function GetAll($sqlQuery, $params = null,
$fetchStyle = PDO::FETCH_ASSOC)
{
// Initialize the return value to null
$result = null;
// Try to execute an SQL query or a stored procedure
try
{
$statement_handler = self::Prepare($sqlQuery);
// Execute the query
$statement_handler->execute($params);
// Fetch result
$result = $statement_handler->fetchAll($fetchStyle);
}
// Trigger an error if an exception was thrown when executing the SQL query
catch(PDOException $e)
{
// Close the database handler and trigger an error
self::Close();
trigger_error($e->getMessage(), E_USER_ERROR);
}
// Return the query results
return $result;
}
// Wrapper method for PDOStatement::fetch()
public static function GetRow($sqlQuery, $params = null,
$fetchStyle = PDO::FETCH_ASSOC)
{
// Initialize the return value to null
$result = null;
// Try to execute an SQL query or a stored procedure
try
{
$statement_handler = self::Prepare($sqlQuery);
// Execute the query
$statement_handler->execute($params);
// Fetch result
$result = $statement_handler->fetch($fetchStyle);
}
// Trigger an error if an exception was thrown when executing the SQL query
catch(PDOException $e)
{
// Close the database handler and trigger an error
self::Close();
trigger_error($e->getMessage(), E_USER_ERROR);
}
// Return the query results
return $result;
}
// Return the first column value from a row
public static function GetOne($sqlQuery, $params = null)
{
// Initialize the return value to null
$result = null;
// Try to execute an SQL query or a stored procedure
try
{
$statement_handler = self::Prepare($sqlQuery);
// Execute the query
$statement_handler->execute($params);
// Fetch result
$result = $statement_handler->fetch(PDO::FETCH_NUM);
/* Save the first value of the result set (first column of the first row)
to $result */
$result = $result[0];
}
// Trigger an error if an exception was thrown when executing the SQL query
catch(PDOException $e)
{
// Close the database handler and trigger an error
self::Close();
trigger_error($e->getMessage(), E_USER_ERROR);
}
// Return the query results
return $result;
}
}
?>
你应该通过一个连接对象(可能PDO)左右,而在不同的地方应该能够挑选起来,无论是作为一个参数,或一些中央对象,该有的都有一个参考,或什么的属性。
有多个连接可能是有用的,它似乎是疯狂的mysql_connect拿起现有的连接时,你可能会想要一个新的 - 但它是疯狂的反正。 只需使用PDO。
如果你使用mysql_pconnect()函数可以使用该方法,如果已经有一个MySQL连接至极将搜索并且如果它发现它,它不会再创建一个。
在可替代的,如果你考虑,也没有在PHP中使用的情况下,可以直接调用PHP数据库对象,如:
class DB {}
DB::connect($host, $user, $pass);
如果使用这种方法,你不必担心多个连接。 当然,如果你需要同时使用一个以上的数据库多个连接,您可以利用的对象实例,或者让你的类,因此它可能需要几个参数,并将其所有存储在一次(不是很recomemded这一个)