我正在構建一個類來處理PayPal IPNs作爲項目的一部分,因爲我已經知道我將需要在至少兩個即將到來的工作中再次使用它 - 我希望確保我的結構能夠讓我重新使用它,而不必重新編碼類 - 我只想處理業務邏輯中的更改。PHP結構 - 接口和stdClass vars
問題的第一部分是re。接口。我還沒有完全掌握它們的用處以及何時何地部署它們。如果我有我的類文件(「class.paypal-ipn.php」),我是否在該文件中實現了接口?
這裏就是我與迄今爲止的工作(功能列表是不完整的,但它只是爲了舉例說明):
CLASS.PAYPAL-IPN-BASE.PHP
interface ipn_interface {
//Database Functions
// Actual queries should come from a project-specific business logic class
// so that this class is reusable.
public function getDatabaseConnection();
public function setDatabaseVars($host="localhost",$user="root",$password="",$db="mydb");
public function dbQuery($SQL);
//Logging Functions
public function writeLog($logMessage);
public function dumpLogToDatabase();
public function dumpLogToEmail();
public function dumpLogToFile();
//Business Logic Functions
private function getTransaction($transactionID);
//Misc Functions
public function terminate();
}
class paypal_ipn_base {
//nothing to do with business logic here.
public function getDatabaseConnection() {
}
public function setDatabaseVars($host="localhost",$user="root",$password="",$db="mydb") {
}
public function dbQuery($SQL) {
}
}
CLASS .PAYPAL-IPN.PHP
final class paypal_ipn extends paypal_ipn_base implements ipn_interface {
//business logic specific to each project here
private function getTransaction($transactionID) {
$SQL = "SELECT stuff FROM table";
$QRY = this->dbQuery($SQL);
//turn the specific project related stuff into something generic
return $generic_stuff; //to be handled by the base class again.
}
}
使用
在這個項目中:
- 需要持續的基礎,而業務邏輯類的類文件。
- Instatiate * paypal_ipn *
- 編寫代碼
在其他項目:
- 複製在基座的IPN類
- 編輯/重寫業務邏輯類* paypal_ipn *的限制範圍內的界面。
- 實例化* paypal_ipn *
- 編寫代碼
所以你可以即時從字面上只是用它來定義的相關功能組並添加註釋見。它使得它更容易閱讀,但它對我來說有什麼(如果有的話)其他好處 - 是否可以將擴展器和基類拉到一起,並在缺少某些東西時強制執行錯誤?
stdClass的問題
問題的第二部分上的可讀性方面構建。在類本身中,存儲變量的數量不斷增加,有些是在構造函數中設置的,有些是由其他函數設置的 - 它們與諸如保存數據庫連接變量(和連接資源本身),代碼是否應該運行在測試模式下,日誌和日誌本身的設置,等等...
我已經開始剛剛建立他們按通常(再次,下面不完整的&用於說明):
$this->dbConnection = false;
$this->dbHost = "";
$this->dbUser = "";
$this->enableLogging = true;
$this->sendLogByEmail = true;
$this->sendLogTo = "[email protected]";
但後來我想通了日益增長的名單可以與一些結構做的,所以我適應它於:
$this->database->connection = false;
$this->database->host = "";
$this->database->user = "";
$this->logging->enable = true;
$this->logging->sendByEmail = true;
$this->logging->emailTo = "[email protected]";
,給了我的變量更容易閱讀列表,當我轉儲整個班級出來,因爲我的代碼&測試。
一旦完成,我打算寫一個項目特定的擴展到泛型類,我將保留查詢的實際SQL - 從一個項目到另一個項目,Paypal的IPN過程和邏輯不會改變 - 但每個項目的數據庫結構都是這樣的,所以擴展到這個類將會把所有東西都清理回單一格式,所以基類不需要擔心它,並且一旦寫入就不需要修改。
所以總而言之只是一個理智的檢查 - 在我走得太遠這條路之前,它看起來像是正確的方法嗎?
我編輯了我原來的問題,詳細闡述了我應該如何設置。如果這不正確,你會介意提供一個真實世界例子的描述嗎?我不需要特定的代碼,只是我可以涉及的東西:)(如果我正確理解你的答案,接口可能是我設置純粹處理會話的類時一直在尋找的答案,一個純粹處理數據庫連接 - 在邏輯上,其他類不是這些的擴展,但它們確實需要它們存在,即,使日誌可以寫入數據庫 - 所以接口就是這裏的答案?) – Codecraft 2011-06-02 16:18:37
似乎每個會話,數據庫)應該得到自己的類,並且如果其他類依賴於它們,則至少有一個接口。那麼你會想將這些類派生的對象注入到依賴它們的對象中。然後可以使用type-hinting來確保只有實現了特定接口的對象才能被接受爲參數。 – dqhendricks 2011-06-02 16:36:47
我真的可以使用一個代碼示例來說明這一點,但我腦海中的燈泡閃爍......我會繼續考慮您的答案,並看看我是否可以永久性地發佈它,謝謝:-) – Codecraft 2011-06-02 16:51:22