2017-02-12 62 views
-1

我目前在PHP中工作,並已開始利用類 - 我正在學習很多東西,但是我仍然有我的「便士下降」時刻 - 我正在努力與對象交互。PHP OOP-對象互動

我真的很感謝關於一個對象如何與另一個對象進行交互的一些澄清。作爲一個非常基本的例子,如果我有一個處理連接和查詢數據庫的數據庫對象,其他類應該如何訪問由數據庫對象執行的查詢結果?

從我的理解到目前爲止,我可以看到2個選項。無論是數據庫類內的查詢結果可公開訪問,並傳遞到其他對象作爲參數...

$databaseObject = new DatabaseObject; 
$databaseObject->query("query goes here"); 

$newObject = randomObject; 
$newObject->doStuff($databaseObject->query()) 

或依賴查詢結果的對象本身內實例化新的數據庫對象,因此該結果包含內目的。

class databaseConnection { 

    public $queryResults; 

    function __construct { 
     connect to database... 
    } 

    function query { 
     perform queries... 
     $this->queryResults = query results 
    } 
} 

class NewObject 
{ 
    function doStuff() { 
     $db = new databaseConnection 
     do stuff with $db->queryResults 
    } 
} 

選項1似乎錯了,因爲在數據庫中的類屬性是全球可用,而選項2似乎矛盾的類只能保存與它們定義對象的方法和屬性的想法。

我可以想到很多其他的例子。如果我創建一個負責在整個系統中管理用戶的類,那麼負責其他任務的類需要知道用戶擁有什麼特權級別,我是否在全局用戶類中創建該特性並將其傳遞給其他類?其他類是否實例化新的用戶對象?

任何幫助非常感謝。

+1

閱讀有關依賴注入的內容 – bxN5

+0

封裝是一個重要的OO概念。您不需要關心數據來自何處,您只需要從數據對象之外的數據中獲取數據,並讓它擔心數據的來源和方式。最簡單的解決方案是將結果作爲SQL行返回,但如果將其轉換爲關聯數組,則派生對象可以使用任何數據庫,xml文件,平面文件,curl call *,並且其他代碼都不會知道或關心哪一個*。 – Mike

+0

我不是將查詢結果保留在數據庫對象中,而是從查詢方法中返回它。我有像queryArray,queryScalar,queryColumn和queryRow以不同方式返回結果集的方法,以及queryExec用於插入/更新/刪除語句。如果您需要一次訪問多個結果集,那麼在數據庫對象中保留結果會讓重複使用同一連接進行多個查詢變得很麻煩。 – reaanb

回答

-2
class Connection { 

    public static $conn; 

    public static function getInstance() { 
    if (!self::$conn) { 
     self::$conn = new Connection(); 
    } 

    return self::$conn; 
    } 

    public function query() { 
     echo "run your query here using self::\$conn object"; 
    } 
} 

class Person { 

    public function doStuff() { 
     $conn = Connection::getInstance(); 
     $results = $conn->query(); 
    } 
} 

$person = new Person(); 
$person->doStuff(); 

首先,你只想讓你的數據庫連接只有一次,而不是每次打開它。

其次,使用相同的數據庫連接對象,可以運行多個查詢,如上例所示。

無論您使用多少個其他類,您都將獲得單個連接。

+0

如果您希望確保您一次不會連接到多個數據庫(除非其連接工廠),則單例只是明智之舉, – symcbean

0

無論是數據庫類內的查詢結果都可以訪問公開

這(對我)的關鍵在於答案。如果您在實例中設置或更改了某個值,則這意味着您要設置基礎數據集中的值(儘管您可能會考慮延遲寫入)。請注意,魔術方法允許您隱式地將操作與get和set操作相關聯。但並非每個查詢都是可更新的。如果你的sql被引入,那麼你可以在設計時確定可更新性。

此外,我建議您的查詢對象有一組記錄對象與它相關聯,您與底層數據進行交互。如果是工廠(支持多個查詢)並創建查詢結果對象,那麼在與查詢相同的對象中綁定連接功能纔有意義。查詢(結果)對象應該可能實現迭代器接口。

pdo和mysqli都將連接,查詢和結果分離爲單獨的對象 - 這是很好的理由。