面向对象的PHP和数据库包装器

时间:2013-04-17 08:59:22

标签: php oop dependency-injection

我正在为PHP预订系统写一个小班。 根据我自己的承认,OOP根本不是我的事 - 但是我想将它用于这个项目,假设我可以收集到足够的理解来正确使用它。

这是我到目前为止的一些内容(主要是伪):

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 个答案:

答案 0 :(得分: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