如何在没有多个连接的情况下使用多个类?

时间:2012-06-23 13:10:53

标签: php mysql database-connection

在目前为止的页面中,我使用了一个连接类和一个类来保存页面的逻辑。但是,我现在有一个页面,我需要根据可能发生的不同场景使用多个类。

这是我能够做的工作,但这似乎是不好的做法。我一直在搜索,但找不到解决方案。所以我的问题是,我正在尝试做什么更好的方式。

<?php
require 'class/connect.php';
$db = new Connect();
require 'class/normal-page.php';
require 'class/get-page.php';
?>

    <?php if (!isset($_GET['id'])) { ?>
        <?php $normalpage = new NormalPage($db); ?>
    <?php
        } else {
        $id = $_GET["id"];
        $getpage = new Getpage($id, $db);
    ?>

        <h1><?php echo $getpage->getTitle(); ?></h1>
        <p><?php echo $getpage->getDescription(); ?></p>
    <?php } ?>


class Normalpage {

    function __construct($db) {

        $query = 'SELECT something FROM table';
        $result = $db->query($query);
}
}

希望足够的信息有意义。简而言之,我包含了连接类,并在其他类中使用该变量。

1 个答案:

答案 0 :(得分:3)

这是处理数据库对象的正确方法。事实上,它被称为dependency injection设计模式,实际上很常见。您可能需要考虑将构造函数参数$db保存到成员变量,以便其他类方法可以通过类似$this->db的方式访问数据库(如果您将成员变量声明为private $db;)。

但是,您可能需要考虑factory设计模式,因为它有助于组织页面的类。请参阅以上链接中的此示例:

class Factory
{
    public static function build($type)
    {
        $class = 'Format' . $type;
        if (!class_exists($class)) {
            throw new Exception('Missing format class.');
        }
        return new $class;
    }
}

class FormatString {}
class FormatNumber {}

try {
    $string = Factory::build('String');
}
catch (Exception $e) {
    echo $e->getMessage();
}

try {
    $number = Factory::build('Number');
}
catch (Exception $e) {
    echo $e->getMessage();
}