面向对象的php5结构
我一直在尝试编写OOP PHP5代码。但我认为我的尝试很笨拙。以下是我的问题:面向对象的php5结构,php,oop,mysqli,pear,Php,Oop,Mysqli,Pear,我一直在尝试编写OOP PHP5代码。但我认为我的尝试很笨拙。以下是我的问题: 它们是否是包含数据库配置信息的更好、更精简的方法 我能在我做的每个函数中声明$db=new db()吗 我应该使用PEAR作为数据库抽象层而不是Mysqli_database.php吗 Mysqli_database.php <?php class Db { private $connection; private function open_connection() {
- 它们是否是包含数据库配置信息的更好、更精简的方法
- 我能在我做的每个函数中声明$db=new db()吗
- 我应该使用PEAR作为数据库抽象层而不是Mysqli_database.php吗
<?php
class Db {
private $connection;
private function open_connection() {
if (file_exists('config.inc.php')) {
require('config.inc.php');
} else {
require('../config.inc.php');
}
try
{
$this->connection = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname);
}
catch (Exception $e)
{
throw $e;
}
}
private function close_connection() {
try
{
mysqli_close($this->connection);
}
catch (Exception $e)
{
throw $e;
}
}
public function query($query) {
try
{
$this->open_connection();
$result = mysqli_query($this->connection,$query);
return $result;
}
catch (Exception $e)
{
throw $e;
}
$this->close_connection();
}
public function fetchArray($query) {
$row = mysqli_fetch_assoc($query);
return $row;
}
public function count_rows($query) {
$row = mysqli_num_rows($query);
return $row;
}
public function rows_affected() {
$row = mysqli_affected_rows($this->connection);
return $row;
}
public function created_id() {
$row = mysqli_insert_id($this->connection);
return $row;
}
}
?>
<?php
class Test_data {
public function show_text() {
$db = new Db();
$sql = $db->query("SELECT * FROM test_table");
$row = $db->fetchArray($sql);
echo 'This is the output: '.$row['text'];
}
}
?>
<?php
$dbname = 'database_name';
$dbhost = 'localhost';
$dbuser = 'database_user';
$dbpass = 'database_password';
?>
<?php
require_once('config.inc.php');
require_once('Mysqli_database.php');
$db = new Db();
$test_data = new Test_data();
?>
<?php
require_once('includes.php');
$test_data->show_text();
?>
Test_data.php
<?php
class Db {
private $connection;
private function open_connection() {
if (file_exists('config.inc.php')) {
require('config.inc.php');
} else {
require('../config.inc.php');
}
try
{
$this->connection = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname);
}
catch (Exception $e)
{
throw $e;
}
}
private function close_connection() {
try
{
mysqli_close($this->connection);
}
catch (Exception $e)
{
throw $e;
}
}
public function query($query) {
try
{
$this->open_connection();
$result = mysqli_query($this->connection,$query);
return $result;
}
catch (Exception $e)
{
throw $e;
}
$this->close_connection();
}
public function fetchArray($query) {
$row = mysqli_fetch_assoc($query);
return $row;
}
public function count_rows($query) {
$row = mysqli_num_rows($query);
return $row;
}
public function rows_affected() {
$row = mysqli_affected_rows($this->connection);
return $row;
}
public function created_id() {
$row = mysqli_insert_id($this->connection);
return $row;
}
}
?>
<?php
class Test_data {
public function show_text() {
$db = new Db();
$sql = $db->query("SELECT * FROM test_table");
$row = $db->fetchArray($sql);
echo 'This is the output: '.$row['text'];
}
}
?>
<?php
$dbname = 'database_name';
$dbhost = 'localhost';
$dbuser = 'database_user';
$dbpass = 'database_password';
?>
<?php
require_once('config.inc.php');
require_once('Mysqli_database.php');
$db = new Db();
$test_data = new Test_data();
?>
<?php
require_once('includes.php');
$test_data->show_text();
?>
config.inc.php
<?php
class Db {
private $connection;
private function open_connection() {
if (file_exists('config.inc.php')) {
require('config.inc.php');
} else {
require('../config.inc.php');
}
try
{
$this->connection = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname);
}
catch (Exception $e)
{
throw $e;
}
}
private function close_connection() {
try
{
mysqli_close($this->connection);
}
catch (Exception $e)
{
throw $e;
}
}
public function query($query) {
try
{
$this->open_connection();
$result = mysqli_query($this->connection,$query);
return $result;
}
catch (Exception $e)
{
throw $e;
}
$this->close_connection();
}
public function fetchArray($query) {
$row = mysqli_fetch_assoc($query);
return $row;
}
public function count_rows($query) {
$row = mysqli_num_rows($query);
return $row;
}
public function rows_affected() {
$row = mysqli_affected_rows($this->connection);
return $row;
}
public function created_id() {
$row = mysqli_insert_id($this->connection);
return $row;
}
}
?>
<?php
class Test_data {
public function show_text() {
$db = new Db();
$sql = $db->query("SELECT * FROM test_table");
$row = $db->fetchArray($sql);
echo 'This is the output: '.$row['text'];
}
}
?>
<?php
$dbname = 'database_name';
$dbhost = 'localhost';
$dbuser = 'database_user';
$dbpass = 'database_password';
?>
<?php
require_once('config.inc.php');
require_once('Mysqli_database.php');
$db = new Db();
$test_data = new Test_data();
?>
<?php
require_once('includes.php');
$test_data->show_text();
?>
includes.php
<?php
class Db {
private $connection;
private function open_connection() {
if (file_exists('config.inc.php')) {
require('config.inc.php');
} else {
require('../config.inc.php');
}
try
{
$this->connection = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname);
}
catch (Exception $e)
{
throw $e;
}
}
private function close_connection() {
try
{
mysqli_close($this->connection);
}
catch (Exception $e)
{
throw $e;
}
}
public function query($query) {
try
{
$this->open_connection();
$result = mysqli_query($this->connection,$query);
return $result;
}
catch (Exception $e)
{
throw $e;
}
$this->close_connection();
}
public function fetchArray($query) {
$row = mysqli_fetch_assoc($query);
return $row;
}
public function count_rows($query) {
$row = mysqli_num_rows($query);
return $row;
}
public function rows_affected() {
$row = mysqli_affected_rows($this->connection);
return $row;
}
public function created_id() {
$row = mysqli_insert_id($this->connection);
return $row;
}
}
?>
<?php
class Test_data {
public function show_text() {
$db = new Db();
$sql = $db->query("SELECT * FROM test_table");
$row = $db->fetchArray($sql);
echo 'This is the output: '.$row['text'];
}
}
?>
<?php
$dbname = 'database_name';
$dbhost = 'localhost';
$dbuser = 'database_user';
$dbpass = 'database_password';
?>
<?php
require_once('config.inc.php');
require_once('Mysqli_database.php');
$db = new Db();
$test_data = new Test_data();
?>
<?php
require_once('includes.php');
$test_data->show_text();
?>
index.php
<?php
class Db {
private $connection;
private function open_connection() {
if (file_exists('config.inc.php')) {
require('config.inc.php');
} else {
require('../config.inc.php');
}
try
{
$this->connection = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname);
}
catch (Exception $e)
{
throw $e;
}
}
private function close_connection() {
try
{
mysqli_close($this->connection);
}
catch (Exception $e)
{
throw $e;
}
}
public function query($query) {
try
{
$this->open_connection();
$result = mysqli_query($this->connection,$query);
return $result;
}
catch (Exception $e)
{
throw $e;
}
$this->close_connection();
}
public function fetchArray($query) {
$row = mysqli_fetch_assoc($query);
return $row;
}
public function count_rows($query) {
$row = mysqli_num_rows($query);
return $row;
}
public function rows_affected() {
$row = mysqli_affected_rows($this->connection);
return $row;
}
public function created_id() {
$row = mysqli_insert_id($this->connection);
return $row;
}
}
?>
<?php
class Test_data {
public function show_text() {
$db = new Db();
$sql = $db->query("SELECT * FROM test_table");
$row = $db->fetchArray($sql);
echo 'This is the output: '.$row['text'];
}
}
?>
<?php
$dbname = 'database_name';
$dbhost = 'localhost';
$dbuser = 'database_user';
$dbpass = 'database_password';
?>
<?php
require_once('config.inc.php');
require_once('Mysqli_database.php');
$db = new Db();
$test_data = new Test_data();
?>
<?php
require_once('includes.php');
$test_data->show_text();
?>
配置信息是一个品味问题。但它最好存储在一个配置对象中,并以一种更面向对象的方式检索,然后再从另一个文件中包含全局变量 可以使用创建新对象
选择的抽象层越多,从一个数据库移动到另一个数据库就越容易。您还可以查看。建立数据库连接有一些非常常见的模式:Singleton、Factory,有时还有Registry 下面是一个人的样子
<?php
class DbConn
{
const CONN_DEV_1 = 'dev.db1';
const CONN_PROD_1 = 'prod.db1';
const CONN_DEV_2 = 'dev.db2';
const CONN_PROD_2 = 'prod.db2';
protected static $instances = array();
protected $conn;
public static function factory( $database, $env )
{
$connectionName = "$env.$database";
if ( !isset( self::$instances[$connectionName] ) )
{
switch ( $connectionName )
{
case self::CONN_DEV_1:
$dbname = 'dev1';
$dbhost = 'localhost';
$dbuser = 'database_user';
$dbpass = 'database_password';
break;
case self::CONN_PROD_1:
$dbname = 'prod1';
$dbhost = 'some.server';
$dbuser = 'database_user';
$dbpass = 'database_password';
break;
case self::CONN_DEV_2:
$dbname = 'dev2';
$dbhost = 'localhost';
$dbuser = 'database_user';
$dbpass = 'database_password';
break;
case self::CONN_PROD_2:
$dbname = 'prod2';
$dbhost = 'some.server';
$dbuser = 'database_user';
$dbpass = 'database_password';
break;
default:
throw new Exception( 'Unrecognized database connection!' );
}
self::$instances[$connectionName] = new self( $dbhost,$dbuser,$dbpass,$dbname );
}
return self::$instances[$connectionName];
}
private function __construct( $dbhost, $dbuser, $dbpass, $dbname )
{
$this->conn = mysqli_connect( $dbhost, $dbuser, $dbpass, $dbname );
}
/* all your other methods here */
}
显然,这里的要点是从当前应用程序配置中提取$env
的值,无论该值来自何处
现在就用法而言,通常您希望传递/传递函数/类一个数据库连接,而不是让它们自己负责建立连接。这提供了更松散的耦合。要使用您的示例:
<?php
class Test_data
{
protected $db;
public function __construct( DbConn $db )
{
$this->db = $db;
}
public function show_text()
{
$sql = $this->db->query( "SELECT * FROM test_table" );
$row = $this->db->fetchArray($sql);
echo 'This is the output: '.$row['text'];
}
}
?>
至于在每个函数中捕获一个实例,像这样的DB对象就是针对Singleton模式给出的实际示例。它真的很适合这里 下面是一个粗略的例子:
class DB
{
// Private Constructor so external code cannot directly instantiate
private function __construct() {
}
public static function instance() {
static $instance = false;
if (!$instance)
$instance = new DB();
return $instance;
}
}
还有一个小的变化,如果您想打开多个DB连接(到不同的数据库),可以使用如下实例方法:
public static function instance($dsn) {
static $instances = array();
if (!isset($instances[$dsn]))
$instances[$dsn] = new DB($dsn);
return $instances[$dsn];
}
对,配置信息的保存是一个品味问题,我喜欢使用常量,那么你知道它在全局范围内不会改变。