2013-04-17 54 views
1

我正在为PHP预订系统编写一个小类。 我自己承认OOP根本就不是我的东西 - 但我想用它来做这个项目,假设我能够收集足够的理解来正确使用它。面向对象的PHP和数据库包装器

这里有一些什么我迄今(主要是伪):

class bookingSystemDbWrapper 
{ 
    public $db; 
    function __construct() 
    { 
     $this->db = mysqli_connect(..., ..., ..., ...);  
    } 
} 

class bookingSystemAvailabilityManager extends bookingSystemDbWrapper 
{ 
    function checkAvailability($date, $roomID) 
    { 
     /** 
     * check availability for a given room on a given date 
     */ 

     $query = mysqli_real_escape_string("SELECT SOMETHING FROM SOMEWHERE"); 
     $result = mysqli_query($this->db, $query); 
     return $result; 
    }   
} 

这种方式工作得很好上方的小和简单的类。但是当我需要一个创建预订的类,根据位置等进行搜索时,为每个类扩展数据库包装看起来是个坏主意。所以我需要另一种方法使我的数据库包装类可用于其他类,以便它们可以运行数据库查询。

我已经阅读了关于nettuts的依赖注入:http://net.tutsplus.com/tutorials/php/dependency-injection-huh/但它超出了我对OOP的有限理解,所以我不确定要采取什么方法或如何正确实现它。

TL; DR

我应该怎样做一个类的公共瓦尔提供给其他类,而不会破坏OOP的任何原则,并保持我的代码可读性?

+1

看到http://stackoverflow.com/questions/15323882/is-it-dependency-injection-and-is-it-a-bad-practise/15324725与详细的解答 –

+0

@catalin类似的问题.costache阅读,现在它变得更有意义了。感谢您的链接 – jammypeach

回答

0

我建议static class,像这样:

<?php 
class dbms 
    { 
     const HOST  = 'localhost'; 
     const LOGIN = 'login'; 
     const PASSWORD = 'myB!GevU1PwD'; 
     const SCHEMA = 'mydb'; 
     const CHARSET = 'utf8'; 
     const PORT  = 3306; 

     protected static $instance; 

     public static function connect() 
      { 
       if(is_object(static::$instance) && (static::$instance instanceof mysqli)) 
        { return static::$instance->ping(); } 

       static::$instance = new mysqli(static::HOST, static::LOGIN, static::PASSWORD, static::SCHEMA, static::PORT); 

       if(static::$instance->connect_errno)return false; 

       static::set_charset(static::CHARSET); 
      } 

     public static function disconnect() 
      { 
       static::$instance->close(); 

       static::$instance = null; 
      } 

     public static function &getInstance(){ return static::$instance; } 
    } 
?> 

应该是易于扩展,并且随处可见,你需要:

  1. 只有一个静态实例共享连接;
  2. 这可能很容易通过extend重新调整用途而不会失去表现;
  3. 它可以从任何你需要的地方访问,因为它是一个static class
+0

这使得更有意义,将使我的代码更清洁 - 非常感谢:) – jammypeach