2014-02-21 122 views
-2

我一直在想這個幾個星期。我的代碼實踐是創建幾個類(插入,更新,刪除等),然後在其中創建函數。PHP實踐更好的代碼

的問題是,每一個功能我做這樣的事情:

public function clients(){ 
    $db = new mysqli($this->host, $this->user, $this->pass, $this->db); 
    if ($db->connect_errno) { 
     printf("Connecting error" . $db->connect_error); 
     return false; 
     exit(); 
    } 
    $db->set_charset("utf8"); 

    $visibile = true; 

    $query = $db->prepare("SELECT * FROM clients WHERE visible = ?"); 
    $query->bind_param("i", $visible); 
    $query->execute(); 
    $query->bind_result($id, $name, $address, $photo); 
    $query->store_result(); 
    $rows = array(); 

    while($query->fetch()){ 

     $rows[] = array("id" => $id, "name" => $name, "address" => $address, "photo" => $photo); 
    } 

    $query->close(); 
    $db->close(); 

    return $rows; 
} 

我一直在想減少這種code..at至少在每個函數的開始連接。

// currently call 
include_once('select.php'); 
$select = new select(); 

$rows = $select->clients(); 

更好的東西會

$select = new select(); 
$rows = $select->connect()->clients(); 

甚至更​​好

$rows = $connect->select()->clients(); 

我知道這是可能的,我只是不知道怎麼辦。或者甚至有比這更好的方法?

+2

有類的名字是動詞是你奇怪的事情構建一個明確的標誌。你在「選擇」和「更新」中封裝了哪些數據和方法? – geoffspear

+0

Seconding @Wooble。你的班級結構當然很奇怪,但讓你開始DI原則將是一個很好的第一步。 – deceze

+0

爲什麼那麼奇怪?比'$ variable-> insert_clients()'更容易閱讀'$ select-> clients()'和'$ insert-> clients($ name)'。 – user3243925

回答

1

Dependency injection!

$db  = new mysqli(...); 
$select = new Select($db); 
$select->clients(); 

class Select { 

    protected $db; 

    public function __construct(mysqli $db) { 
     $this->db = $db; 
    } 

    public function clients() { 
     $this->db->... 
     ... 
    } 

} 

的優勢是顯而易見的,希望。您不僅可以在所有方法中共享一個$db實例,還可以共享您的所有類。它也不會對班級內的數據庫細節進行硬編碼。

+1

我會停止寫我的答案,因爲這幾乎是我會說的。然而,爲了方便起見,我建議OP創建一個'Database'類來創建'mysqli'連接。所以你會說'$ db = new Database(); $ select = new Select($ db);' – Sam

+1

@Sam取決於您是否還想*抽象*您的數據庫連接器,但是,當然不是一個壞主意。也許工廠也會這樣做。 – deceze

0

您應該首先在課堂上方建立連接,然後將其注入課堂。 然後在構造函數中將連接綁定到var。 最後,您可以在班級中的任何功能中使用連接。

class Select { 
    public function __construct(mysqli $db) { 
     $this->db = $db; 
    } 
    public function clients() { 
     $query = $this->db->prepare(); 
    } 
} 

$db = new mysqli(); // Make connection 

$class = new Select($db); // Pass the database variable into the class 
+0

爲每個頁面建立連接?我不認爲這是最好的解決方案。看到我標記爲正確的答案。 – user3243925

+0

當然不是,我不是這樣建議的,它應該從你的課程開始的地方設置得更高。這與接受的答案完全相同。 – vonUbisch

+0

你是對的,我已經讀過答案,它是一樣的。雖然我不想那樣。我希望能夠在'__construct()'中初​​始化mysqli。 – user3243925

0

我會用Repository Pattern(與Dependency Injection)去。你會發現更多的信息there

目標是讓任何其他業務邏輯類都可以使用類,該類提供了一種簡單的方法來保存和檢索對象。

你會最終擁有:

class Database 
{ 
    public function select(...) 
    ... 
} 

而且你的倉庫(使用數據庫)

class ClientsRepository // probably : implements RepositoryInterface 
{ 
    protected $db; 

    public function __construct(Database $db) 
    { 
     $this->db = $db; 
    } 

    public function findAll() 
    { 
     // use $this->db to select * 
    } 
}