Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
面向对象的php5结构_Php_Oop_Mysqli_Pear - Fatal编程技术网

面向对象的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() {

我一直在尝试编写OOP PHP5代码。但我认为我的尝试很笨拙。以下是我的问题:

  • 它们是否是包含数据库配置信息的更好、更精简的方法
  • 我能在我做的每个函数中声明$db=new db()吗
  • 我应该使用PEAR作为数据库抽象层而不是Mysqli_database.php吗
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];

}

对,配置信息的保存是一个品味问题,我喜欢使用常量,那么你知道它在全局范围内不会改变。