2012-06-23 53 views
0

到目前爲止,我已經使用過一個連接類和一個類來保存頁面的邏輯。然而,我現在有一個頁面,我需要根據可能發生的不同場景使用多個類。如何在沒有多個連接的情況下使用多個類?

這是我已經能夠做的工作,但它似乎是不好的做法。我已經四處搜尋,但找不到解決方案。所以我的問題是,什麼是我想要做的更好的方式。

<?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); 
} 
} 

希望這是足夠的信息是有道理的。所以簡而言之,我包含connect類,並在其他兩個類中使用該變量。

+1

除了@ nickb的答案,我建議你看看自動加載類。這樣,你不必指定你有類文件包括,因爲它們會自動加載,請參閱http://php.net/manual/en/language.oop5.autoload.php – jeroen

+0

我覺得你可以讓你的使用[autoloading](http://php.net/manual/de/language.oop5.autoload.php)也會讓生活變得更輕鬆。 **編輯:**像吉榮寫道,與此同時,同樣的想法;) – hakre

回答

3

這是處理數據庫對象的正確方法。實際上,它被稱爲dependency injection設計模式,實際上很常見。你可能要考慮的構造函數的參數$db保存到一個成員變量,這樣其他類方法可以,如果你宣佈該成員變量private $db;通過類似$this->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(); 
} 
+1

此外,您可以看看做一個連接[單](http://en.wikipedia.org/wiki/Singleton_pattern)或只是更換在'Connect'上帶有一個靜態類變量的'$ db'。這意味着您可以隨時訪問您的$ db變量作爲Connect :: db或Connect :: db()。 – Stecman

+0

當你必須同時處理多個數據庫連接時,你會遇到單身問題。 – brezanac

+1

另請參閱[誰需要單身人士?](http://stackoverflow.com/a/4596323/862594) – nickb

相關問題