2013-12-18 23 views
2

我很新的PHP OOP的,到目前为止我使用,我在一个PHP文件提出多个类,如:如何使用多个类在PHP

class Style { 
//stuff 
} 
class User { 
//other stuff 
} 

还有更多,但我有一个关于如何连接到这些类中的MySQL的问题,如果我使用$db = new Mysqli();我将如何能够从内部类进行查询?如果我想让自己的连接器类如下:

class Connection extends mysqli { 
    public function __construct($host, $user, $pass, $db) { 
    parent::__construct($host, $user, $pass, $db); 
    if (mysqli_connect_error()) { 
     die('Connect Error (' . mysqli_connect_errno() . ') ' 
     . mysqli_connect_error()); 
     } 
    }  
} 

如何能够在不同的类中进行查询?或者什么是正确使用oop的更好方法?用多个类来组织代码的不同部分? 任何帮助或提示将不胜感激,谢谢。怎么样使用PDO?这是否使一切变得更容易?

+0

使用类似[Symfony](http://symfony.com/)的框架。他们正是解决了这些问题,所以你可以专注于手头的任务。 ;-) – nietonfir

+0

PDO是一个具有多个数据库供应商接口的API。 MySQLi只能访问MySQL数据库,但PDO可以访问MySQLi,MSSQL,SQLite等。它不是常规数据库驱动程序API的完整版本,但它可以帮助您支持多个供应商,而无需为每个供应商编写一个类。 – Crackertastic

回答

6
class Style { 
    public function __construct($conn) { 
     $this->conn = $conn; 
     //use $this->conn in the class 
    } 
} 

$db = new Mysqli(); 
$style = new Style($db); 

我觉得第一个例子是首选的方法,但你可以创建一个简单的注册表类,并用它来存储一个$ db对象等

如果可能的话我可能会使用PDO但没有按解决不了这个问题。

+0

这是否意味着我将不得不添加连接到我创建的每个类?会有其他方式而不是这样做吗?我可以访问全球? – SuperBeast

+1

我认为依赖注入是首选的方法,但您可以使用注册表。 – AbraCadaver

+0

您可以使用global关键字来访问全局数据库变量,但是一旦项目增长,这不是一个很好的解决方案。使用构造函数将提供更好的控制和可追溯性,并且更容易找到错误。 –

-2

使用PDO会给你很多的功能和灵活性,它有许多内置的驱动程序。 做你正在尝试做的,是一个样本: STEP 1: 做一个主类,将处理您的数据库:

class app extends PDO { 
    protected $database_hostname = "localhost"; 
    protected $database_username = "root"; 
    protected $database_password = ""; 
    protected $database_name = "testdb"; 
    protected $database_type = "mysqli"; 

    public function __construct() { 

     try { 
      parent::__construct($this->database_type . ':host=' . $this->database_hostname . ';dbname=' . $this->database_name, $this->database_username, $this->database_password, array(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)); 
     } catch (PDOException $e) { 
      echo 'ERROR: ' . $e->getMessage(); 
     } 
    } 
} 

STEP 2: 那么你需要initilze一个globale变量作为你的数据库:

$db= new app() ; 

步骤3: 包括一个局部变量来处理数据库中的其他类:

class User{ 
public $db ; 
} 

STEP 4: 在其他类的构造函数(用户的为例),你需要通过参考globale变量传递的局部变量:

class User{ 
     public $db ; 
     public function __construct(){ 
      global $db; 
      $this->db =& $db; 
     } 
    } 

STEP 5: 然后如果你想执行从类中您可以通过局部变量做一个请求:

$this->db->query("SELECT * FROM user"); 

从外面只需使用:$db->query("SELECT * FROM user");

I H有帮助的ope!

0

由于您正在扩展mysqli类,因此如果您自己实例化该类(只要这些函数不是私有的),就可以像访问这些函数一样访问这些函数。尽管有些人(包括我自己)会用数据库连接在自己的自定义类中实例化数据库连接,然后将该类注入需要它的类中。

class MyDatabase { 

    private $this->dbi; 

    public function __construct() {} 

    public function connectDB($host, $user, $pass, $db)) { 
     //You can do this in the constructor too, doesn't have to be its own function 
     $this->dbi = new mysqli($host, $user, $pass, $db); 
    } 

    public function getDBI() { 
     return $this->dbi; 
    } 
} 

您可以将您想要的所有功能添加到您自己的类(或扩展类)中,也可以让任何需要数据库扩展您的数据库类的类。但是这并不是最好的(每个类将有不同的db类/连接)。最简单的可能是将你的数据库连接导入你的班级。通过构造函数或其他函数;

class MyClass { 

    private $this->database; 

    public function __construct($db) { 
     $this->database = $db->getDBI(); 
    } 

    public function query($q) { 
     //Of course, clean your data first, and best practices use prepared statements 
     $result = $this->database->query($q); 
     return $result; 
    } 
} 

然后建立数据库连接并将它注入到类中。

$db = new MyDatabase(); 
$db->connectDB('localhost', 'username', 'password', 'mydb'); 

$class = new MyClass($db); 
$resultSet = $class->query("SELECT * FROM MyTable"); //Obviously anything the user could add here is to not be trusted.