我正在为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原则的情况下将一个类的公共变量提供给其他类,并保持我的代码可读?
答案 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; }
}
?>
应该易于扩展,并且随处可见:
extend
重新调整用途而不会失去性能; static class
。